• 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();  
                }  
            }  
        }  
    }  
    
  • 相关阅读:
    arcgis10.4.X的oracle数据库要求
    面试高峰期,如何应对面试官的jvm刁难,特写一篇jvm面经(第一部)
    某公司面试打分文档,75分通过
    git-github 提示Permission denied (publickey) (windows)
    jar项目 BeanDefinitionParsingException: Configuration problem:Unable to locate Spring NamespaceHandler for XML schema namespace
    关于No Spring WebApplicationInitializer types detected on classpath的提示,tomcat 卡主
    spring+orm框架的兼容问题
    程序员常用工具
    IDEA-常见问题
    IDEA-基本设置
  • 原文地址:https://www.cnblogs.com/xinhudong/p/6125503.html
Copyright © 2020-2023  润新知