作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服
java通信二:利用Socket实现聊天室功能

Custom Tab

最近研究了下java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人。

目录结构:

20170207102632120.png

ChatClient:

package com.panda.chat;  
  
import java.awt.*;  
import java.awt.event.*;  
import java.io.*;  
import java.net.*;  
  
@SuppressWarnings("serial")  
public class ChatClient extends Frame {  
    private TextArea ta = new TextArea();  
    private TextField tf = new TextField();  
    private DataOutputStream dos = null;  
    private DataInputStream dis = null;  
    private Socket socket = null;  
    private boolean bConnected = false;  
    private Thread thread=null;  
    public static void main(String[] args) {  
        new ChatClient().frameClient();  
    }  
    public void frameClient(){  
        setSize(400, 400);  
        setLocation(400,300);  
        add(ta,BorderLayout.NORTH);  
        add(tf,BorderLayout.SOUTH);  
        pack();  
        tf.addActionListener(new TfListener());  
        //关闭窗口事件监听  
        this.addWindowListener(new WindowAdapter() {  
            @Override  
            public void windowClosing(WindowEvent e) {  
                disconnected();  
                System.exit(0);  
            }  
        });  
        this.connect();  
        setVisible(true);  
    }  
    //链接服务器地址  
    private void connect(){  
        try {  
            socket = new Socket("127.0.0.1", 8888);  
            thread=new Thread(new ChatThread());  
            thread.start();  
            dos = new DataOutputStream(socket.getOutputStream());  
            dis = new DataInputStream(socket.getInputStream());  
        } catch (UnknownHostException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
    //断开连接  
    private void disconnected(){  
        bConnected = false;  
        try {  
            dos.close();  
            dis.close();  
            socket.close();  
        } catch (IOException e1) {  
            // TODO Auto-generated catch block  
            e1.printStackTrace();  
        }  
    }  
    //键盘回车事件  
    private class TfListener implements ActionListener{  
  
        @Override  
        public void actionPerformed(ActionEvent e) {  
            String strMsg = tf.getText();  
            tf.setText("");  
            try {  
                dos.writeUTF(strMsg);  
                dos.flush();  
            } catch (IOException e1) {  
                // TODO Auto-generated catch block  
                e1.printStackTrace();  
            }  
        }  
          
    }  
    //开启线程接受服务器信息  
    private class ChatThread implements Runnable{  
        @Override  
        public void run() {  
            try {  
                bConnected = true;  
                while(bConnected){  
                    String msg = dis.readUTF();  
                    String taText = ta.getText();  
                    ta.setText(taText+msg+"\n");  
                }  
            } catch (SocketException e) {  
                System.out.println("退出");;  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}

ChatServer:

package com.panda.chat;  
  
import java.io.*;  
import java.net.*;  
import java.util.*;  
  
public class ChatServer {  
    private boolean started = false;  
    private List<ChatThread> chatThreads = new ArrayList<ChatThread>();  
    public static void main(String[] args) {  
        new ChatServer().startServer();  
    }  
    private void startServer(){  
        try {  
            //开启服务端Socket  
            ServerSocket seso = new ServerSocket(8888);  
            started = true;  
            while(started){  
                //接受客户端连接请求  
                Socket sos = seso.accept();  
                System.out.println("一个客户端已连接");  
                //开启线程处理客户端通信  
                ChatThread ct = new ChatThread(sos);  
                chatThreads.add(ct);  
                new Thread(ct).start();  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }   
    }  
    private class ChatThread implements Runnable{  
        private Socket socket;  
        private DataInputStream din=null;  
        private DataOutputStream don=null;  
        private boolean bConnected = false;  
        public ChatThread(Socket socket) {  
            super();  
            this.socket = socket;  
        }  
        //发送信息的函数  
        private void send(String strMsgIn){  
            try{  
                don.writeUTF(strMsgIn);  
                don.flush();  
            }catch(IOException e){  
                e.printStackTrace();  
            }  
        }  
        @Override  
        public void run() {  
            try{  
                din = new DataInputStream(socket.getInputStream());  
                don = new DataOutputStream(socket.getOutputStream());  
                //读取数据  
                bConnected = true;  
                while(bConnected){  
                    String strMsgIn = din.readUTF();  
                    System.out.println(strMsgIn);  
                    //接收到数据后发送给每个客户端  
                    for(int i =0;i<chatThreads.size();i++){  
                        chatThreads.get(i).send(strMsgIn);  
                    }  
                }  
            }catch (IOException e) {  
                try {  
                    //如果客户端出错或关闭,直接关闭连接,并移除List中的当前线程  
                    socket.close();  
                    chatThreads.remove(this);  
                } catch (IOException e1) {  
                    // TODO Auto-generated catch block  
                    e1.printStackTrace();  
                }  
            } finally{  
                try {  
                    din.close();  
                    don.close();  
                    socket.close();  
                } catch (IOException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            }  
        }  
      
    }  
}

运行ChatSever后,再同时打开多次ChatClient,就可以实现多人聊天了,你也试试。

22222222222222.png

转载自:http://blog.csdn.net/eric_ley/article/details/54906931

Home