• Socket通信入门小实例


    客户端:

    public class Client {
    
        private int port = 8000;  
        private String host = "localhost";  
        private Socket socket;  
      
        public Client() throws UnknownHostException, IOException {  
            socket = new Socket(host, port);  
        }  
      
        public void readFromUser() throws IOException{  
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
            String line;  
            while((line = br.readLine()) != null){  
                if(line.equals("bye")){  
                    socket.close();  
                    System.out.println("关闭socket");  
                    break;  
                }  
                send(line);  
            }  
        }  
          
        public void send(String msg) throws IOException {  
            PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);  
            pw.println(msg);  
        }  
      
        public static void main(String args[]) throws UnknownHostException,  
                IOException {  
            new Client().readFromUser();  
        }  
    }

    服务端:

    public class Server {
    
        private int port = 8000;  
        private ServerSocket serverSocket;  
        private ExecutorService executorService;  
        private final int POOL_SIZE = 4;  
      
        public Server() throws IOException {  
            serverSocket = new ServerSocket(port, 2);  
            // 创建线程池  
            executorService = Executors.newFixedThreadPool(Runtime.getRuntime()  
                    .availableProcessors()  
                    * POOL_SIZE);  
            System.out.println("服务器启动。。。。。" + "初始线程数:"  
                    + Runtime.getRuntime().availableProcessors() * POOL_SIZE);  
        }  
      
        public void service() throws IOException {  
            int count = 0;  
            while (true) {  
                Socket socket = serverSocket.accept();  
                System.out.println(++count + "客户端已链接");  
                // new Thread(new Handler(socket)).start();  
                executorService.execute(new Handler(socket));  
            }  
        }  
      
        public static void main(String args[]) throws IOException {  
            new Server().service();  
        }  
      
        private class Handler implements Runnable {  
      
            private Socket socket;  
      
            public Handler(Socket socket) {  
                this.socket = socket;  
            }  
      
            public void run() {  
                try {  
                    handle();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
      
            private void handle() throws IOException {  
                BufferedReader br = new BufferedReader(new InputStreamReader(socket  
                        .getInputStream()));  
                String line;  
                while ((line = br.readLine()) != null) {  
                    if(line.equals("goodbye")){  
                        socket.close();  
                        serverSocket.close();  
                        break;  
                    }  
                    System.out.println("From " + socket.getPort() + ":" + line);  
                }  
            }  
        }  
    }

    服务器采用了JDK自带的线程池来处理并发请求。 

    还可以使用NIO来实现,即非阻塞通信

  • 相关阅读:
    Go语言之函数基础
    Go语言之内置函数与包函数
    【LeetCode】1668.最大重复子字符串(三)
    [Python]编码规范性(四)——注释(属性、格式)
    【LeetCode】1929. 数组串联(2)
    [Python]编码规范性(三)——注释(类、接口、函数)
    [Python]编码规范性(五)——命名(包和模块、类、函数)
    [Python]序列为空的判定
    【LeetCode】27. 移除元素
    [Python]编码规范性(一)——排版(缩进、语句、空格)
  • 原文地址:https://www.cnblogs.com/liushao/p/6375256.html
Copyright © 2020-2023  润新知