美文网首页浅尝JavaJava学习笔记iOS Developer
练习Java的Socket即时通讯,创建服务端与客户端交互

练习Java的Socket即时通讯,创建服务端与客户端交互

作者: lixuCoding | 来源:发表于2016-08-09 17:38 被阅读763次

    效果图如下:

    screen.gif

    代码和功能都很简单,就不用解释了,直接上代码。
    服务端代码如下:

    public class SimpleChatServer {  
        ArrayList<PrintWriter> clientOutputStreams;  
        public static void main(String[] args){  
            new SimpleChatServer().go();  
        }  
          
        public class ClientHandler implements Runnable{  
            BufferedReader reader;  
            Socket sock;  
            public ClientHandler(Socket clientSocket){  
                try{  
                    sock = clientSocket;  
                    InputStreamReader isReader = new InputStreamReader(sock.getInputStream());  
                    reader = new BufferedReader(isReader);  
                }catch(Exception ex){  
                    ex.printStackTrace();  
                }  
            }  
            @Override  
            public void run() {  
                String message;  
                try{  
                    while((message = reader.readLine()) != null){  
                        System.out.println("server: read: " + message);  
                        tellEveryone(message);  
                    }  
                }catch(Exception ex){  
                    ex.printStackTrace();  
                }  
            }  
        }  
          
        public void tellEveryone(String message){  
            Iterator<PrintWriter> it = clientOutputStreams.iterator();  
            while(it.hasNext()){  
                try{  
                    PrintWriter writer = (PrintWriter)it.next();  
                    writer.println(message);  
                    writer.flush();  
                }catch(Exception ex){  
                    ex.printStackTrace();  
                }  
            }  
        }  
          
        public void go(){  
            clientOutputStreams = new ArrayList<PrintWriter>();  
            try{  
                ServerSocket serverSock = new ServerSocket(5000);  
                while(true){  
                    Socket clientSocket = serverSock.accept();  
                    PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());  
                    clientOutputStreams.add(writer);  
                    Thread t = new Thread(new ClientHandler(clientSocket));  
                    t.start();  
                    System.out.println("got a connection");  
                }  
            }catch(Exception ex){  
                ex.printStackTrace();  
            }  
        }  
    } 
    

    客户端代码如下:

    public class SimpleChatClient {  
        JTextArea incoming;  
        JTextField outgoing;  
        BufferedReader reader;  
        PrintWriter writer;  
        Socket sock;  
        static String clientName;  
      
        public static void main(String[] args) {  
            SimpleChatClient client = new SimpleChatClient();  
            clientName = JOptionPane.showInputDialog("Please input the client name :");  
            client.go();  
        }  
      
        public void go() {  
            // build GUI  
            JFrame frame = new JFrame(clientName + "'s Chat Client");  
            JPanel mainPanel = new JPanel();  
            incoming = new JTextArea(15,20);    
            incoming.setLineWrap(true);  
            incoming.setWrapStyleWord(true);  
            incoming.setEditable(false);  
      
            JScrollPane qScroller = new JScrollPane(incoming);  
            qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);  
            qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);  
      
            outgoing = new JTextField(20);  
      
            JButton sendButton = new JButton("Send");  
            sendButton.addActionListener(new SendButtonListener());  
      
            mainPanel.add(qScroller);  
            mainPanel.add(outgoing);  
            mainPanel.add(sendButton);  
      
            setUpNetworking();  
            Thread readerThread = new Thread(new IncomingReader());  
            readerThread.start();  
      
            frame.getContentPane().add(BorderLayout.CENTER, mainPanel);  
            frame.setSize(400,500);  
            frame.setVisible(true);  
      
        } // close go  
      
        private void setUpNetworking() {   
            try {  
                sock = new Socket("127.0.0.1", 5000);  
                InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());  
                reader = new BufferedReader(streamReader);  
      
                writer = new PrintWriter(sock.getOutputStream());  
      
                System.out.println("networking established");  
            } catch(IOException ex) {  
                ex.printStackTrace();  
            }  
        } // close setUpNetworking    
      
        public class SendButtonListener implements ActionListener {  
            public void actionPerformed(ActionEvent ev) {  
                try {  
                    writer.println(clientName+" : "+outgoing.getText());  
                    writer.flush();  
                } catch(Exception ex) {  
                    ex.printStackTrace();  
                }  
                outgoing.setText("");  
                outgoing.requestFocus();  
            }  
        }  // close SendButtonListener inner class  
      
        public class IncomingReader implements Runnable {  
            public void run() {  
                String message = null;              
                try {  
                    while ((message = reader.readLine()) != null) {                         
                        System.out.println("client1: read: " + message);  
                        incoming.append(message + "\n");  
                    } // close while  
                } catch(Exception ex) {ex.printStackTrace();}  
            } // close run  
        } // close inner class      
    }  
    



    源码请点击github地址下载。


    QQ:2239344645 我的github

    相关文章

      网友评论

        本文标题:练习Java的Socket即时通讯,创建服务端与客户端交互

        本文链接:https://www.haomeiwen.com/subject/mfedsttx.html