第三章 ServerSpcket用法详解
构造ServerSocket
ServerSocket的构造方法如下:
ServerSocket()
//Creates an unbound server socket. ServerSocket(int port)
//Creates a server socket, bound to the specified port. ServerSocket(int port, int backlog)
//Creates a server socket and binds it to the specified local port number, with the
//specified backlog. ServerSocket(int port, int backlog, InetAddress bindAddr)
//Create a server with the specified port, listen backlog, and local IP address to
//bind to.
参数port指定服务器需要绑定的端口(监听端口),参数backlog指定客户连接请求队列的长度,参数bindAddr指定服务器需要绑定的IP地址。
参数port设为0时,由系统自动分配端口。
当队列中的连接请求达到了队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求。当服务器通过ServerSocket.accept()方法从队列取出连接请求时,队列腾出空位,新的连接请求加入队列。
对于客户机进程,如果他发出的连接请求被加入到服务器队列,则说明连接成功,客户机Socket正常返回,否则抛出ConnectionException异常。
以下建立Server与Client代码进行验证:
//Server代码
package Section_03; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class Server {
private int port=8001;
private ServerSocket serverSocket; public Server() throws IOException{
serverSocket = new ServerSocket(port,3);
System.out.println("服务器启动!");
} public void service(){
while(true){
Socket socket=null;
try{
socket=serverSocket.accept();
System.out.println("新的连接 "+socket.getInetAddress()+":"+socket.getPort());
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(socket!=null){
socket.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException, InterruptedException {
// TODO Auto-generated method stub
Server server = new Server();
Thread.sleep(60000*10);
server.service();
} } //Client代码
package Section_03; import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
// TODO Auto-generated method stub
int length=100;
String host="localhost";
int port=8001; Socket[] sockets=new Socket[length];
for(int i=0;i<length;i++){
sockets[i]=new Socket(host,port);
System.out.println("第"+(i+1)+"次连接成功!");
}
Thread.sleep(3000);
for(int i=0;i<length;i++){
sockets[i].close(); }
} }
因为Server启动10分钟后才执行service方法,故10分钟之前都不会从队列取出连接请求。当队列达到三个后便拒绝后面新的请求。Client执行效果如下:
第1次连接成功!
第2次连接成功!
第3次连接成功!
Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at Section_03.Client.main(Client.java:17)
使用无参构造函数
ServerSocket有一个无构造函数,它的作用时运行服务器在绑定端口前,先设置一些选项,再通过bind方法绑定端口。因为一旦绑定端口后,有些选项无法改变。
如下代码:
ServerSocket serverSocket=new ServerSocket(8000);
serverSocket.setReuserAddress(true);
第二行代码是无效的。应该改为:
ServerSocket serverSocket=new ServerSocket();
serverSocket.setReuserAddress(true);
serverSocket.bind(new InetSocketAddress(8000));
本章未完待续……
第三章 ServerSpcket用法详解的更多相关文章
- “全栈2019”Java第一百零三章:匿名内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 第三章 rsync 命令详解和实战用法
一.rsync传输模式 1.本地模式2.远程模式3.守护进程模式 二.守护进程模式 1.安装rsync[root@backup ~]# yum -y install rsync 2.配置rsync[r ...
- 第二章 Socket用法详解
构造Socket Socket构造方法如下: Socket() //Creates an unconnected socket, with the system-default type of Soc ...
- 第三章 Struts2配置详解
3.1 Struts2执行过程 1.获取Struts2资源 2.在应用程序中导入Struts2的类库 3.在web.xml中配置StrutsPrepareAndExecuteFilt ...
- SVN组成中trunk,branches and tags功能用法详解
SVN组成中trunk,branches and tags功能用法详解 我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说 ...
- Android Fragment用法详解(2)--动态添加Fragment
在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- window.onload用法详解:
网页中的javaScript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免这种情况的发生,可以使用以下两种方式: 一.将脚本代码放在网页的底端,这样在运行脚本代 ...
随机推荐
- day 90 DjangoRestFramework学习二之序列化组件
DjangoRestFramework学习二之序列化组件 本节目录 一 序列化组件 二 xxx 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 首先按照 ...
- Microbit蓝芽配对
Microbit蓝芽配对 (Bluetooth Pairing) Microbit 可以像手机或平板与其他蓝芽装置一样,一旦做完第一次配对完就可以使用”蓝芽服务” paired with the mi ...
- 【树形DP】MZOJ_1063_士兵守卫
本题也是这三天来在下写的几篇树形DP之一,但是不知道为什么洛谷上面老是unknown error,...直接去了UVa,说我编译错误...我在想是不是头文件的原因,于是被逼无奈,交了一道c89的代码. ...
- Vim Go开发环境搭建
基本搭建流程参考了网上的博文以及Vimgo的Github主页 博文https://www.cnblogs.com/breg/p/5386365.html Vim-go主页(我能不能加入项目,做点贡献呢 ...
- 20155222 2016-2017-2 《Java程序设计》实验一
实现Fibonacci数列功能,并进行测试. 源代码: import java.util.Scanner; public class fibonacci { public static void ma ...
- 预备作业03:虚拟机安装及Linux操作系统练习
安装虚拟机 安装时遇到的问题 在打开虚拟机时出现以下问题: 经查询该问题只需要更改其兼容性,使其"以管理员身份运行". 常用的Linux命令 $ who am i:查看当前伪终端的 ...
- 使用Python进行分布式系统协调 (ZooKeeper/Consul/etcd)
来源:naughty 链接:my.oschina.net/taogang/blog/410864 笔者之前的博文提到过,随着大数据时代的到来,分布式是解决大数据问题的一个主要手段,随着越来越多的分布式 ...
- 【LG5021】[NOIP2018]赛道修建
[LG5021][NOIP2018]赛道修建 题面 洛谷 题解 NOIP之前做过增强版还没做出来\(QAQ\) 一看到题目中的最大值最小,就很容易想到二分答案 重点是考虑如何\(check\) 设\( ...
- MSP430的JTAG接口和BSW接口
1.JTAG口,JTAG引脚如下定义: 单片机TCK——测试时钟输入,接仿真器7脚 单片机TDI——测试数据输入,接仿真器2脚 单片机TDO——测试数据输出,接仿真器1脚 单片机TMS——测试 ...
- postgresql parallel join example
CREATE TABLE public.pgbench_accounts_bak ( aid integer NOT NULL, bid integer, abalance integer, fill ...