zoukankan      html  css  js  c++  java
  • 分布式-网络通信-线程(socket)

    package OIO;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    /**
     * 传统socket服务端
     *
     */
    public class OioServer {
    
        @SuppressWarnings("resource")
        public static void main(String[] args) throws Exception {
    
            ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
            //创建socket服务,监听10101端口
            ServerSocket server=new ServerSocket(10101);
            System.out.println("服务器启动!");
            while(true){
                //获取一个套接字(阻塞)
                final Socket socket = server.accept();
                System.out.println("来个一个新客户端!");
                newCachedThreadPool.execute(new Runnable() {
                    
                    @Override
                    public void run() {
                        //业务处理
                        handler(socket);
                    }
                });
                
            }
        }
        
        /**
         * 读取数据
         * @param socket
         * @throws Exception
         */
        public static void handler(Socket socket){
                try {
                    byte[] bytes = new byte[1024];
                    InputStream inputStream = socket.getInputStream();
                    
                    while(true){
                        //读取数据(阻塞)
                        int read = inputStream.read(bytes);
                        if(read != -1){
                            System.out.println(new String(bytes, 0, read));
                        }else{
                            break;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }finally{
                    try {
                        System.out.println("socket关闭");
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
        }
    }

    传统IO加线程池

    加了线程池的服务端可以连接多个客户端

    第一步

    输入命令cmd 打开控制台,输入 telnet  127.0.0.1 10101连接上服务端。

    按ctrl+] 打开回显,输入send hello发送消息1

    第二步

    输入命令cmd 打开控制台,输入 telnet  127.0.0.1 10101连接上服务端。

    按ctrl+] 打开回显,输入send hello2发送消息2

    第三步

    这时,发现服务端没有阻塞,可以接收到两个消息。

    问题--》输入 telnet  127.0.0.1 10101连接上服务端报telnet不是内部文件

    解决:打开或关闭Windows功能 -->勾选Telnet客户端

    总结:

    传送IO特点
    阻塞点
    server.accept();
    inputStream.read(bytes);

    单线程情况下只能有一个客户端

    用线程池可以有多个客户端连接,但是非常消耗性能

  • 相关阅读:
    053364
    053363
    oracle导出批量表N行记录
    053362
    053361
    053360
    053359
    053358
    053357
    053356
  • 原文地址:https://www.cnblogs.com/caoyingjielxq/p/9323954.html
Copyright © 2011-2022 走看看