【达内课程】Socket编程基础(2)

上一节中还有很多需要优化

.accept()方法是阻塞执行的,阻塞,然后等待连接,一旦有客户端过来连接,那么这句代码就可以接着向下执行
如果没有客户端连接,那么会一直阻塞

现在,我想让一个人连完之后再执行accept接着连接第二个人,可以在外边加一个while(true)来一直执行,下面继续昨天的栗子


/**
 * 服务端
 */
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(8888);
            //阻塞执行 接受客户端的连接请求
            System.out.println("服务端已启动...");

            while(true){
                Socket socket = ss.accept();
                ......
                socket.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行Server
这里写图片描述
运行Client
这里写图片描述
此时Server的日志是
这里写图片描述

现在再运行第二个Client
这里写图片描述

这时结束第一个Client
这里写图片描述

这时第二个Client的日志是
这里写图片描述

这时Server的日志
这里写图片描述

按照以上思路修改Server.java

/**
 * 服务端
 */
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(8888);
            //阻塞执行 接受客户端的连接请求
            System.out.println("服务端已启动...");

            while(true){
                Socket socket = ss.accept();
                System.out.println("客户端进来了"+socket.getInetAddress());
                //启动工作线程
                new WorkThread(socket).start();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 处理客户端交互的工作线程
     */
    static class WorkThread extends Thread{
        private Socket socket;
        public WorkThread(Socket socket){
            this.socket = socket;
        }

        @Override
        public void run(){
            //获取输出流
            try {
                OutputStream os = socket.getOutputStream();
                ......
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

运行Server

运行Client
这里写图片描述

运行第二个Client
这里写图片描述

此时Server输出日志
这里写图片描述

现在有3个线程

猜你喜欢

转载自blog.csdn.net/u010356768/article/details/81067112