当前位置: 代码迷 >> Java Web开发 >> 关于java多用户在线聊天程序的有关问题。
  详细解决方案

关于java多用户在线聊天程序的有关问题。

热度:171   发布时间:2016-04-17 10:18:12.0
关于java多用户在线聊天程序的问题。。
以下是服务端代码
Java code
import java.net.*;import java.net.*;import java.io.*;public class Server{    private final int maxClientCount = 10;    private int clientNum = 0;    private ServerSocket ss;    private ChatThread communicationThread[];    public Server(){        //创建ServerSocket,允许10人在线        try{            ss = new ServerSocket(10000,maxClientCount);        }        catch(IOException e){            System.err.println(e.toString());            System.exit(1);        }                communicationThread = new ChatThread[maxClientCount];        //循环等待用户连接        for(int i=0;i<maxClientCount;i++){            try{                communicationThread[i] = new ChatThread(ss.accept(),i);    //连接成功时启动它                communicationThread[i].start();                clientNum++;            }            catch(IOException e){                System.err.println(e.toString());                System.exit(1);            }        }    }    //线程类    private class ChatThread extends Thread{           private Socket socket;        private int clientID;        private DataInputStream br;        private DataOutputStream bw;        public ChatThread(Socket socket,int number){            this.socket = socket;            clientID = number;            try{                //从socket获得输入流和输出流                br = new DataInputStream(socket.getInputStream());                bw = new DataOutputStream(socket.getOutputStream());            }            catch(IOException e){                System.err.println(e.toString());                System.exit(1);            }        }        //run()方法        public void run(){            try{                bw.writeInt(clientID);            }            catch(IOException e){                System.err.println(e.toString());                System.exit(1);            }            //循环读一用户的信息,并把它发送给其他用户            while(true){                try{                    //读对应的用户发送过来的信息                    String message = br.readUTF();                    //发送给其他用户                    for(int i=0;i<clientNum;i++){                        communicationThread[i].bw.writeUTF("客户" + clientID + ":" + message);                    }                    if(message != null && message.equals("bye"))                        break;                }                catch(IOException e){                    System.err.println(e.toString());                    System.exit(1);                }            }            try{                bw.close();                br.close();                socket.close();            }            catch(EOFException e){                System.err.println(e.toString());            }            catch(IOException e){                System.err.println(e.toString());            }        }    }            public static void main(String args[]){        new Server();    }}

以下是客户端的代码
Java code
import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.net.*;import java.io.*;public class Client extends JFrame implements Runnable{    private int clientID;    private String clientWord;    private JPanel topPanel;    private JLabel nameLabel;    private JTextField wordField;    private JButton submit;    private JTextArea displayField;    private Socket socket;    private DataInputStream br;    private DataOutputStream bw;    //构造面板    public Client(){        Container container = getContentPane();        container.setLayout(new BorderLayout(5,5));        topPanel = new JPanel(new FlowLayout());        nameLabel = new JLabel("");        wordField = new JTextField(20);        submit = new JButton("发送");        submit.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent event){                try{                    String sentence = wordField.getText();                    bw.writeUTF(sentence);                }                catch(IOException e){                    System.err.println(e.toString());                }            }        });        topPanel.add(nameLabel);        topPanel.add(wordField);        topPanel.add(submit);        displayField = new JTextArea();        container.add(topPanel,BorderLayout.NORTH);        container.add(displayField,BorderLayout.CENTER);        setSize(400,500);        setResizable(false);        setVisible(true);    }    //主方法    public static void main(String args[]){        Client clientWindow = new Client();        clientWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        clientWindow.nor();    }    //创建线程和socket连接    public void nor(){        Thread commThread = new Thread(this);        commThread.start();        try{            socket = new Socket("127.0.0.1",10000);            br = new DataInputStream(socket.getInputStream());            bw = new DataOutputStream(socket.getOutputStream());        }        catch(IOException e){            System.err.println(e.toString());        }    }    //run方法    public void run(){        try{            //设置Label的文本            clientID = br.readInt();            SwingUtilities.invokeLater(new Runnable(){                public void run(){                    nameLabel.setText("客户" + clientID);                }            });            //循环读服务端发来的信息            while(true){                clientWord = br.readUTF();                displayMessage(clientWord);            }        }        catch(EOFException e){            System.err.println(e.toString());        }        catch(IOException e){            System.err.println(e.toString());        }    }    //把信息显示出来    private void displayMessage(final String message){        SwingUtilities.invokeLater(new Runnable(){            public void run(){                displayField.append(message + "\n");                displayField.setCaretPosition(displayField.getText().length());            }        });    }}
  相关解决方案