zoukankan      html  css  js  c++  java
  • Java--Socket通信(双向)

    新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端
    两个工程的读写操作线程类基本上完全相同

    服务端:

    import java.io.BufferedReader;  
    import java.io.DataInputStream;  
    import java.io.DataOutputStream;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
    import java.net.ServerSocket;  
    import java.net.Socket;  
      
    public class Server {  
      
        public static final int PORT = 8000;//监听的端口号     
      
        public static void main(String[] args) {    
            Server server = new Server();    
            server.init();    
        }    
      
        public void init() {    
            ServerSocket serverSocket = null;  
            try {    
                serverSocket = new ServerSocket(PORT);    
                while (true) {    
                    Socket client = serverSocket.accept();    
                    //一个客户端连接就开户两个线程处理读写    
                    new Thread(new ReadHandlerThread(client)).start();    
                    new Thread(new WriteHandlerThread(client)).start();   
                }    
            } catch (Exception e) {    
                e.printStackTrace();    
            } finally{  
                try {  
                    if(serverSocket != null){  
                        serverSocket.close();  
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }    
    }    
      
    /*  
     *处理读操作的线程   
     */  
    class ReadHandlerThread implements Runnable{  
        private Socket client;  
      
        public ReadHandlerThread(Socket client) {  
            this.client = client;  
        }  
      
        @Override  
        public void run() {  
            DataInputStream dis = null;  
            try{  
                while(true){  
                    //读取客户端数据    
                    dis = new DataInputStream(client.getInputStream());  
                    String reciver = dis.readUTF();  
                    System.out.println("客户端发过来的内容:" + reciver);   
                }  
            }catch(Exception e){  
                e.printStackTrace();  
            }finally{  
                try {  
                    if(dis != null){  
                        dis.close();  
                    }  
                    if(client != null){  
                        client = null;  
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
      
    /*  
     * 处理写操作的线程  
     */  
    class WriteHandlerThread implements Runnable{  
        private Socket client;  
      
        public WriteHandlerThread(Socket client) {  
            this.client = client;  
        }  
      
        @Override  
        public void run() {  
            DataOutputStream dos = null;  
            BufferedReader br = null;  
            try{  
                while(true){  
                    //向客户端回复信息    
                    dos = new DataOutputStream(client.getOutputStream());    
                    System.out.print("请输入:	");    
                    // 键盘录入    
                    br = new BufferedReader(new InputStreamReader(System.in));  
                    String send = br.readLine();    
                    //发送数据  
                    dos.writeUTF(send);    
                }  
            }catch(Exception e){  
                e.printStackTrace();  
            }finally{  
                try {  
                    if(dos != null){  
                        dos.close();  
                    }  
                    if(br != null){  
                        br.close();  
                    }  
                    if(client != null){  
                        client = null;  
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    } 
    

    客户端:

    import java.io.BufferedReader;  
    import java.io.DataInputStream;  
    import java.io.DataOutputStream;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
    import java.net.Socket;  
      
    public class Client {  
      
        public static final String IP = "localhost";//服务器地址   
        public static final int PORT = 8000;//服务器端口号    
      
        public static void main(String[] args) {    
            handler();   
        }  
      
        private static void handler(){  
            try {  
                //实例化一个Socket,并指定服务器地址和端口  
                Socket client = new Socket(IP, PORT);  
                //开启两个线程,一个负责读,一个负责写  
                new Thread(new ReadHandlerThread(client)).start();  
                new Thread(new WriteHandlerThread(client)).start();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
    }    
      
    /*  
     *处理读操作的线程   
     */  
    class ReadHandlerThread implements Runnable{  
        private Socket client;  
      
        public ReadHandlerThread(Socket client) {  
            this.client = client;  
        }  
      
        @Override  
        public void run() {  
            DataInputStream dis = null;  
            try {  
                while(true){  
                    //读取服务器端数据    
                    dis = new DataInputStream(client.getInputStream());  
                    String receive = dis.readUTF();     
                    System.out.println("服务器端返回过来的是: " + receive);    
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            } finally{  
                try {  
                    if(dis != null){  
                        dis.close();  
                    }  
                    if(client != null){  
                        client = null;  
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
      
    /*  
     * 处理写操作的线程  
     */  
    class WriteHandlerThread implements Runnable{  
        private Socket client;  
      
        public WriteHandlerThread(Socket client) {  
            this.client = client;  
        }  
      
        @Override  
        public void run() {  
            DataOutputStream dos = null;  
            BufferedReader br = null;  
            try {  
                while(true){  
                    //取得输出流  
                    dos = new DataOutputStream(client.getOutputStream());  
                    System.out.print("请输入: 	");    
                    //键盘录入  
                    br = new BufferedReader(new InputStreamReader(System.in));  
                    String send = br.readLine();    
                    //发送数据  
                    dos.writeUTF(send);    
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  finally{  
                try{  
                    if(dos != null){  
                        dos.close();  
                    }  
                    if(br != null){  
                        br.close();  
                    }  
                    if(client != null){  
                        client = null;  
                    }  
                }catch(Exception e){  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
    
  • 相关阅读:
    Tomcat中实现IP访问限制
    webservice ssl双向认证配置
    如何更专业的使用Chrome开发者工具
    C++中常量成员函数的含义
    写时拷贝COW(copy-on-write)
    char* 、const char*和string之间的转换
    C++模板特化与偏特化
    lamda表达式和尾置返回类型
    编译期多态和运行时多态
    静态绑定和动态绑定
  • 原文地址:https://www.cnblogs.com/xinhudong/p/6125503.html
Copyright © 2011-2022 走看看