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()之后后续的连接就可以顺利的执行了。
ServerSocket01的更多相关文章
随机推荐
- 第13条:合理利用try/expect/else/finally结构中的每个代码块
核心知识点: (1)无论try块是否发生异常,都可以使用try/finally复合语句中地finally块来执行清理工作. (2)顺利运行try块后,若想使某些操作能在finally块地清理代码之前执 ...
- HDU 5869 Different GCD Subarray Query(2016大连网络赛 B 树状数组+技巧)
还是想不到,真的觉得难,思路太巧妙 题意:给你一串数和一些区间,对于每个区间求出区间内每段连续值的不同gcd个数(该区间任一点可做起点,此点及之后的点都可做终点) 首先我们可以知道每次添加一个值时gc ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
- Hive- Hive 按时间定期插入分区表
写个shell脚本Hive 按时间定期插入分区表,由于今天统计的是昨天的数据所以日期减一. #!/bin/bash DT=`date -d '-1 day' "+%Y-%m-%d" ...
- C++的异常捕获
听课笔记: #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; void fun() { ;// ...
- 异步刷新页面的前进与后退的实现--pushState replaceState
实现目标 页面的跳转(前进后退,点击等)不重新请求页面 页面URL与页面展现内容一致(符合人们对传统网页的认识) 在不支持的浏览器下降级成传统网页的方式 使用到的API history.state 当 ...
- zookeeper+dubbo问题
1.java.lang.IllegalStateException: Context namespace element 'component-scan' and its parser class [ ...
- unity的一些重要技巧(转)【整理他人的东西】
刚开始学习Unity3D时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享.原文地址: http://devmag.org ...
- Python基础-处理时间模块
import datetime, time # print(time.time()) # 获取当前时间戳,从unix元年开始到现在过了多少秒# print(time.sleep(19)) # 休息几s ...
- 使用Chrome采集摄像头并生成视频下载
主要使用2个技术点:WebRtc 的 getUserMedia 和 MediaRecorder 注意点 开始录制调用 start 方法要传入一个采样间隔,这样录制的媒体会按照你设置的值进行分割成一个个 ...