zoukankan      html  css  js  c++  java
  • 极客教学笔记---Java实现简单聊天客户端模拟


    偶然间在网上看见的教程,想着弥补下自己对java的空白就写了这个学习一下。结果来说不够完善,关于UTF-8接受方会出现乱码。在此仅用于以后参考工程结构。

    MySocketServer:

    package testmySocket.main;
    
    public class MySocketServer {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		new ServerListener().start();
    	}
    
    }
    

    ServerListener:

    package testmySocket.main;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    import javax.swing.JOptionPane;
    
    public class ServerListener extends Thread {
    	public void run(){
    		//1-65535
    		try{
    			ServerSocket serverSocket = new ServerSocket(12345);
    			while(true){
    				//block
    				Socket socket = serverSocket.accept();
    				//building link
    				JOptionPane.showMessageDialog(null, "有客户端连接到了本机的12345号端口");
    				//将Socket传递给新的线程
    				ChatSocket cs = new ChatSocket(socket);
    				cs.start();
    				ChatManager.getChatManager().add(cs);
    			}
    		} catch(IOException e){
    			e.printStackTrace();
    		}
    	}
    }
    

    ChatSocket:

    package testmySocket.main;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.net.Socket;
    
    public class ChatSocket extends Thread {
    	Socket socket;
    	public ChatSocket(Socket s){
    		this.socket = s;
    	}
    	
    	public void out(String out){
    		try {
    			socket.getOutputStream().write(out.getBytes("UTF-8"));
    		} catch (UnsupportedEncodingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	public void run(){
    		try {
    			BufferedReader br = new 
    					BufferedReader(new 
    							InputStreamReader(socket.getInputStream(),"UTF-8"));
    			String line = null;
    			while((line = br.readLine())!=null){
    				System.out.println(line);
    				ChatManager.getChatManager().publish(this, line);
    			}
    			br.close();
    		} catch (UnsupportedEncodingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e){
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
      

    ChatManager:

    package testmySocket.main;
    
    import java.util.Vector;
    
    public class ChatManager {
    	private  ChatManager(){}
    	private static final ChatManager cm = new ChatManager();
    	public static ChatManager getChatManager(){
    		return cm;
    	}
    	Vector<ChatSocket> vector = new Vector<ChatSocket>();
    	
    	public void add(ChatSocket cs){
    		vector.add(cs);
    	}
    	
    	public void publish(ChatSocket cs,String out){
    		for(int i=0 ; i<vector.size() ; i++){
    			ChatSocket csChatSocket = vector.get(i);
    			if(!cs.equals(csChatSocket)){
    				csChatSocket.out(out+"
    ");
    			}
    		}
    	}
    }
    

    StartClient:

    package test2;
    
    import java.awt.EventQueue;
    
    import test3.MainWindow;
    
    public class StartClient {
    
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					MainWindow frame = new MainWindow();
    					frame.setVisible(true);
    					ChatManager.getCM().setWindow(frame);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    }
    

    MainWindow:

    package test3;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    
    import test2.ChatManager;
    
    import javax.swing.JTextArea;
    import javax.swing.GroupLayout;
    import javax.swing.GroupLayout.Alignment;
    import javax.swing.JButton;
    import javax.swing.LayoutStyle.ComponentPlacement;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    public class MainWindow extends JFrame {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private JPanel contentPane;
    	JTextArea txt;
    
    	 /** 
    	 * Create the frame.
    	 */
    	public MainWindow() {
    		setAlwaysOnTop(true);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(100, 100, 450, 300);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		
    		txt = new JTextArea();
    		txt.setText("Ready...");
    		
    		JTextArea Ip = new JTextArea();
    		Ip.setText("127.0.0.1");
    		
    		JButton button = new JButton("u8FDEu63A5u5230u670Du52A1u5668");
    		button.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent arg0) {
    				ChatManager.getCM().connect(Ip.getText());
    			}
    		});
    		
    		JTextArea send = new JTextArea();
    		send.setText("u4F60u597D");
    		
    		JButton button_1 = new JButton("u53D1u9001");
    		button_1.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent arg0) {
    				ChatManager.getCM().send(send.getText());
    				appendText("我说:"+send.getText());
    				send.setText(" ");
    			}
    		});
    		GroupLayout gl_contentPane = new GroupLayout(contentPane);
    		gl_contentPane.setHorizontalGroup(
    			gl_contentPane.createParallelGroup(Alignment.LEADING)
    				.addGroup(Alignment.TRAILING, gl_contentPane.createSequentialGroup()
    					.addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING)
    						.addComponent(txt, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 423, Short.MAX_VALUE)
    						.addGroup(Alignment.LEADING, gl_contentPane.createSequentialGroup()
    							.addComponent(Ip)
    							.addPreferredGap(ComponentPlacement.RELATED)
    							.addComponent(button))
    						.addGroup(gl_contentPane.createSequentialGroup()
    							.addComponent(send, GroupLayout.DEFAULT_SIZE, 345, Short.MAX_VALUE)
    							.addPreferredGap(ComponentPlacement.UNRELATED)
    							.addComponent(button_1)))
    					.addContainerGap())
    		);
    		gl_contentPane.setVerticalGroup(
    			gl_contentPane.createParallelGroup(Alignment.LEADING)
    				.addGroup(gl_contentPane.createSequentialGroup()
    					.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
    						.addComponent(button)
    						.addComponent(Ip, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
    					.addPreferredGap(ComponentPlacement.RELATED)
    					.addComponent(txt, GroupLayout.DEFAULT_SIZE, 175, Short.MAX_VALUE)
    					.addPreferredGap(ComponentPlacement.RELATED)
    					.addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING)
    						.addComponent(button_1)
    						.addComponent(send, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
    		);
    		contentPane.setLayout(gl_contentPane);
    	}
    	
    	public void appendText(String in){
    		txt.append("
    "+in);
    	}
    }
    

    ChatManager:

    package test2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    import test3.MainWindow;
    
    public class ChatManager {
    	
    	private ChatManager(){};
    	private static final ChatManager instance = new ChatManager();
    	public static ChatManager getCM(){
    		return instance;
    	}
    	
    	MainWindow window;
    	private String Ip;
    	Socket socket;
    	BufferedReader reader;
    	PrintWriter writer;
    	
    	public void setWindow(MainWindow window){
    		this.window = window;
    		window.appendText("文本框已经和ChatManager绑定。");
    	}
    	
    	public void connect(String ip){
    		this.Ip = ip;
    		new Thread(){
    
    			@Override
    			public void run() {
    				try {
    					socket = new Socket(Ip,12345);
    					writer = new PrintWriter(
    							 new OutputStreamWriter(socket.getOutputStream()));
    					reader = new BufferedReader(
    							 new InputStreamReader(socket.getInputStream(),"UTF-8"));
    					String line = null;
    					while((line = reader.readLine()) != null){
    						window.appendText("收到:"+line);
    					}
    					writer.close();
    					reader.close();
    					writer = null;
    					reader = null;
    					
    				} catch (UnknownHostException e) {
    					e.printStackTrace();
    				} catch (IOException e){
    					e.printStackTrace();
    				}
    			}
    			 
    			
    		}.start();
    	}
    	
    	public void send(String out){
    		if(writer != null){
    			writer.write(out+"
    ");
    			writer.flush();
    		}else{
    			window.appendText("当前链接已经中断...");
    		}
    	}
    }
    

    最终效果图:


  • 相关阅读:
    人员考勤,MySQL数据库一个表自动生成3表筛选人员迟到早退缺勤
    Thinkphp中js报错,Uncaught SyntaxError: Unexpected token }
    Invalid ON UPDATE clause for 'create_date' column
    mysql创建某个数据库中的某张表 只读用户
    iOS开发 iOS9横屏后状态栏隐藏处理
    iOS开发 个别页面是否支持页面旋转
    iOS开发 点击某处横屏竖屏切换
    iOS开发 QQ粘性动画效果
    iOS开发 贝塞尔曲线
    iOS开发 获取状态栏的点击事件
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514160.html
Copyright © 2011-2022 走看看