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();  
                }  
            }  
        }  
    }  
    
  • 相关阅读:
    强弱类型 静态语言 动态语言 || 脚本语言
    mysql版本升级问题处理
    word
    IntelliJ IDEA 插件
    dubbo
    spring源码构建
    zookeeper 本地多线程模拟分布式事务控制及配置中心
    一次性关闭所有的Activity
    可能以后用得到得东西
    Thread.sleep还是TimeUnit.SECONDS.sleep
  • 原文地址:https://www.cnblogs.com/xinhudong/p/6125503.html
Copyright © 2011-2022 走看看