• ServerSocket01


      ServerSocket表示服务端套接字;我们首先来看下其中的一个构造器:

    public ServerSocket(int port,int backlog) throws IOException

      其中port表示的就是要绑定的端口号;backlog表示服务端所连接的最大长度;客户端要连接服务端,那么所有的客户端会形成一个先进先出的队列,而这个队列的最大长度是由服务端来决定的,backlog就表示这个长度;值得注意的是这个最大长度和操作系统还有关系,如果超过了操作系统限制的最大长度,那么依然是操作系所默认的最大长度。假设我们存在100个客户端,1个服务端,那我们设置请求的最大长度就是3.来看看如下所示的代码,首先创建客户端:

    package com.asiaInfo.caozg.zh_02;
    
    import java.net.Socket;
    
    /**
     * @Authgor: gosaint
     * @Description:
     * @Date Created in 11:26 2018/2/7
     * @Modified By:
     * 客户端数据
     */
    public class Client_02 {
    
        public static void main(String[] args) throws Exception{
            final int length=100;//设置socket的数量
            final String host="localhost";
            final int port=8000;
            //客户端socket(localhost以及8000端口是连接的服务器)
            Socket[] sockets=new Socket[length];
            for(int i=0;i<100;i++){
                //建立100次的连接
                sockets[i]=new Socket(host,port);
                System.out.println("第"+(i+1)+"次连接成功");
            }
            Thread.sleep(3000);
            for(int i=0;i<100;i++){
                sockets[i].close();
            }
        }
    }

    接着我们编码服务端:

    package com.asiaInfo.caozg.zh_02;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @Authgor: gosaint
     * @Description:
     * @Date Created in 11:37 2018/2/7
     * @Modified By:
     * 服务端程序
     */
    public class Server_02 {
        private ServerSocket serverSocket;
        private int port=8000;
    
        public Server_02() throws IOException{
            //在这里服务端设置最大的连接数为3
            serverSocket=new ServerSocket(port,3);
            System.out.println("服务器启动");
        }
        public void service() throws IOException {
            Socket socket=null;
            while(true){
                //从连接队列中取出一个连接socket
                socket=serverSocket.accept();
                System.out.println("1个新的连接对象"+socket.getInetAddress()+":"+socket.getPort());
                if(socket!=null){
                    socket.close();
    
                }
            }
        }
    
        public static void main(String[] args) throws IOException, InterruptedException {
            Server_02 server_02=new Server_02();
            Thread.sleep(6000*10);//睡眠10分钟
            server_02.service();
        }
    }

    我们可以看到服务端启动的时候使用方法accept()从请求队列中取出一个socket,建立连接执行程序;初始化的时候服务端启动,但是因为最大连接数为3,我们还没有调用service()方法,因此队列已经满了,后续的连接不能进行。因此结果如下:

    第1次连接成功
    第2次连接成功
    第3次连接成功
    Exception in thread "main" java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)

    当取消Thread.sleep()之后后续的连接就可以顺利的执行了。

  • 相关阅读:
    LINUX下 my.cnf php.ini的位置
    如何启动/停止/重启MySQL
    Windows下Git Bash中文乱码
    linux下忘记密码怎么办,如何重置密码
    如何在word里面插入目录
    git常见问题解决办法
    git配置global信息
    怎样把excel一列分成多列
    php中array_flip数组翻转
    笔记本电脑键盘字母和字母错乱怎样解决
  • 原文地址:https://www.cnblogs.com/gosaint/p/8436434.html
Copyright © 2020-2023  润新知