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()之后后续的连接就可以顺利的执行了。

ServerSocket01的更多相关文章

随机推荐

  1. 【转载】Java定时器的学习

    前几看了一下<thinking in java>了解到java原生的Times类有两个问题: (1)Timer是启动单个线程来处理所有的时间任务,如果一个任务耗时很久,那么如果在执行这个过 ...

  2. PIG执行MR时报Connection refused错误

    原因是jobhistory没有启动,其启动脚本位于hadoop/sbin目录下 启动命令如下 mr-jobhistory-daemon.sh start historyserver

  3. Vim 替换命令

    一,":substitute"的使用 :substitute 命令可以对一个指定范围的区域执行替换操作,可以简写为:s ,它的通用形式如下: :[range]substitute/ ...

  4. WebSocket实现Web聊天室

    一.客户端: JS代码如下: /* * 这部分js将websocket封装起来 */ var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSock ...

  5. log4net性能小探

    初步测试了Log4性能.Appender架构如下. 一般客户端,使用FileAppender,把Log记录在本地磁盘. <lockingModel type="log4net.Appe ...

  6. linux用户管理与用户组的重要文件

    用户管理的2个重要文件:/etc/passwd和/etc/shadow. /etc/passwd文件里存放的是用户的信息,其中不包含密码:passwd文件中每一行代表一个用户,且每一行分为7个字段使用 ...

  7. MySQL- 常用的MySQL函数,指令等

    MySQL查看版本: status: 或者 select version(); //select @@version MySQL昨天, 一周前 ,一月前 ,一年前的数据 这里主要用到了 DATE_SU ...

  8. Spark- RDD简介

    Spark里面提供了一个比较重要的抽象——弹性分布式数据集(resilient distributed dataset),简称RDD.弹性:数据可大可小,可分布在内存或磁盘,当某台机器宕机时,能够按照 ...

  9. Spark- Spark内核架构原理和Spark架构深度剖析

    Spark内核架构原理 1.Driver 选spark节点之一,提交我们编写的spark程序,开启一个Driver进程,执行我们的Application应用程序,也就是我们自己编写的代码.Driver ...

  10. C#--父子页面传值、刷新(showModalDialog)

    父页面: var obj = new Object(); obj.name="name"; var rtnValue=window.showModalDialog("ch ...