zoukankan      html  css  js  c++  java
  • 一个 Java 的 Socket 服务器和客户端通信的例子

      一个 HelloWord 级别的 Java Socket 通信的例子。通讯过程:
      先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求。然后运行 Client 端,客户端发出连接请求,服务端监听到这次请求后向客户端发回接受消息,连接建立,启动一个线程去处理这次请求,然后继续死循环监听其他请求。客户端输入字符串后按回车键,向服务器发送数据。服务器读取数据后回复客户端数据。这次请求处理完毕,启动的线程消亡。如果客户端接收到 "OK" 之外的返回数据,会再次发送连接请求并发送数据,服务器会为这次连接再次启动一个线程来进行响应。。。直到当客户端接收到的返回数据为 "OK" 时,客户端退出。

    服务端源代码:

    public class Server {  
        public static final int PORT = 12345;//监听的端口号     
          
        public static void main(String[] args) {    
            System.out.println("服务器启动...
    ");    
            Server server = new Server();    
            server.init();    
        }    
        
        public void init() {    
            try {    
                ServerSocket serverSocket = new ServerSocket(PORT);    
                while (true) {    
                    // 一旦有堵塞, 则表示服务器与客户端获得了连接    
                    Socket client = serverSocket.accept();    
                    // 处理这次连接    
                    new HandlerThread(client);    
                }    
            } catch (Exception e) {    
                System.out.println("服务器异常: " + e.getMessage());    
            }    
        }    
        
        private class HandlerThread implements Runnable {    
            private Socket socket;    
            public HandlerThread(Socket client) {    
                socket = client;    
                new Thread(this).start();    
            }    
        
            public void run() {    
                try {    
                    // 读取客户端数据    
                    DataInputStream input = new DataInputStream(socket.getInputStream());  
                    String clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException  
                    // 处理客户端数据    
                    System.out.println("客户端发过来的内容:" + clientInputStr);    
        
                    // 向客户端回复信息    
                    DataOutputStream out = new DataOutputStream(socket.getOutputStream());    
                    System.out.print("请输入:	");    
                    // 发送键盘输入的一行    
                    String s = new BufferedReader(new InputStreamReader(System.in)).readLine();    
                    out.writeUTF(s);    
                      
                    out.close();    
                    input.close();    
                } catch (Exception e) {    
                    System.out.println("服务器 run 异常: " + e.getMessage());    
                } finally {    
                    if (socket != null) {    
                        try {    
                            socket.close();    
                        } catch (Exception e) {    
                            socket = null;    
                            System.out.println("服务端 finally 异常:" + e.getMessage());    
                        }    
                    }    
                }   
            }    
        }    
    }    

    客户端源代码:

    public class Client {  
        public static final String IP_ADDR = "localhost";//服务器地址   
        public static final int PORT = 12345;//服务器端口号    
          
        public static void main(String[] args) {    
            System.out.println("客户端启动...");    
            System.out.println("当接收到服务器端字符为 "OK" 的时候, 客户端将终止
    ");   
            while (true) {    
                Socket socket = null;  
                try {  
                    //创建一个流套接字并将其连接到指定主机上的指定端口号  
                    socket = new Socket(IP_ADDR, PORT);    
                        
                    //读取服务器端数据    
                    DataInputStream input = new DataInputStream(socket.getInputStream());    
                    //向服务器端发送数据    
                    DataOutputStream out = new DataOutputStream(socket.getOutputStream());    
                    System.out.print("请输入: 	");    
                    String str = new BufferedReader(new InputStreamReader(System.in)).readLine();    
                    out.writeUTF(str);    
                        
                    String ret = input.readUTF();     
                    System.out.println("服务器端返回过来的是: " + ret);    
                    // 如接收到 "OK" 则断开连接    
                    if ("OK".equals(ret)) {    
                        System.out.println("客户端将关闭连接");    
                        Thread.sleep(500);    
                        break;    
                    }    
                      
                    out.close();  
                    input.close();  
                } catch (Exception e) {  
                    System.out.println("客户端异常:" + e.getMessage());   
                } finally {  
                    if (socket != null) {  
                        try {  
                            socket.close();  
                        } catch (IOException e) {  
                            socket = null;   
                            System.out.println("客户端 finally 异常:" + e.getMessage());   
                        }  
                    }  
                }  
            }    
        }    
    }

      注意: Socket 输出流写数据方法是 writeUTF 时,输入流读取相关数据要用 readUTF。否则会抛 EOFException 异常。具体原因请参考文后链接。
    参考资料:http://stackoverflow.com/questions/5489915/java-datainputstream-read-operations-throwing-exceptions

  • 相关阅读:
    某个牛人做WINDOWS系统文件详解
    常用ASP脚本程序集锦
    LINUX基础:文件安全与权限
    proftpd+mysql+quota
    apache2.0.49tomcat5.0.19jk2建立virtualHost
    URL Redirection(转) Anny
    顶级域名后缀列表(转) Anny
    \u4E00\u9FA5意义 Anny
    How to POST Form Data Using Ruby(转) Anny
    How to get rid of 'Enter password to unlock your login keyring' in Ubuntu(转) Anny
  • 原文地址:https://www.cnblogs.com/liushao/p/6378632.html
Copyright © 2011-2022 走看看