构造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用法详解的更多相关文章

  1. “全栈2019”Java第一百零三章:匿名内部类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. 第三章 rsync 命令详解和实战用法

    一.rsync传输模式 1.本地模式2.远程模式3.守护进程模式 二.守护进程模式 1.安装rsync[root@backup ~]# yum -y install rsync 2.配置rsync[r ...

  3. 第二章 Socket用法详解

    构造Socket Socket构造方法如下: Socket() //Creates an unconnected socket, with the system-default type of Soc ...

  4. 第三章 Struts2配置详解

    3.1 Struts2执行过程    1.获取Struts2资源    2.在应用程序中导入Struts2的类库    3.在web.xml中配置StrutsPrepareAndExecuteFilt ...

  5. SVN组成中trunk,branches and tags功能用法详解

    SVN组成中trunk,branches and tags功能用法详解  我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说 ...

  6. Android Fragment用法详解(2)--动态添加Fragment

    在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...

  7. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  8. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  9. window.onload用法详解:

    网页中的javaScript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免这种情况的发生,可以使用以下两种方式: 一.将脚本代码放在网页的底端,这样在运行脚本代 ...

随机推荐

  1. Hive(10)-文件存储格式

    Hive支持的存储数据的格式主要有:TEXTFILE .SEQUENCEFILE.ORC.PARQUET 一. 列式存储和行式存储 左边为逻辑表,右边第一个为行式存储,第二个为列式存储 1. 行式存储 ...

  2. linux几个重要的组合键

    我们在用Windows系统时,有没有感觉快键键让我们工作更有效率,在Linux系统中仍有很好用的快捷键,这些快捷键可以辅助我们进行指令的编写与程序的中断呢,下面介绍几个经常用到的快捷键. 一.Tab- ...

  3. 《Act with Prudence》读后感

    <97 Things Every Should Know>中第一个编程方面的建议 文章链接:行事谨慎 很赞同文章中的观点,在做项目中是要谨慎行事和考虑后果.一直在项目前期考虑不够周到,以至 ...

  4. 20155214 2016-2017-2 《Java程序设计》第2周学习总结

    20155214 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 Java的基本类型比C多了boolean型和byte型,缺少了long double型,ch ...

  5. 20155220 2016-2017-2 《Java程序设计》第10周学习总结

    20155220 2016-2017-2 <Java程序设计>第10周学习总结 教材内容学习总结 计算机网络编程概述 路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控 ...

  6. 20155233 2006-2007-2 《Java程序设计》第4周学习总结

    20155233 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章: 继承:子类继承父类,避免重复的行为定义. extends关键词:继承并扩充行为. ...

  7. 20155306 实验四 Android程序设计

    20155306 实验四 Android程序设计 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握An ...

  8. 2017-2018-1 20155308《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155308<信息安全技术>实验二--Windows口令破解 实验原理 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理员的了解,猜测 ...

  9. cv::Mat转换QImage

    cvtColor(img, img, CV_BGR2RGB); QImage image((uchar*)img.data,img.cols,img.rows,QImage::Format_RGB88 ...

  10. ELKStack入门篇(四)之Filebeat

    Filebeat是轻量级单用途的日志收集工具,用于在没有安装java的服务器上专门收集日志,可以将日志转发到logstash.elasticsearch或redis等场景中进行下一步处理. 官方文档: ...