构造ServerSocket

  ServerSocket的构造方法如下:

  1. ServerSocket()
  2. //Creates an unbound server socket.
  3.  
  4. ServerSocket(int port)
  5. //Creates a server socket, bound to the specified port.
  6.  
  7. ServerSocket(int port, int backlog)
  8. //Creates a server socket and binds it to the specified local port number, with the
  9. //specified backlog.
  10.  
  11. ServerSocket(int port, int backlog, InetAddress bindAddr)
  12. //Create a server with the specified port, listen backlog, and local IP address to
  13. //bind to.

  参数port指定服务器需要绑定的端口(监听端口),参数backlog指定客户连接请求队列的长度,参数bindAddr指定服务器需要绑定的IP地址。

  参数port设为0时,由系统自动分配端口。

  当队列中的连接请求达到了队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求。当服务器通过ServerSocket.accept()方法从队列取出连接请求时,队列腾出空位,新的连接请求加入队列。

  对于客户机进程,如果他发出的连接请求被加入到服务器队列,则说明连接成功,客户机Socket正常返回,否则抛出ConnectionException异常。

  以下建立Server与Client代码进行验证:

  1. //Server代码
  2. package Section_03;
  3.  
  4. import java.io.IOException;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7.  
  8. public class Server {
  9. private int port=8001;
  10. private ServerSocket serverSocket;
  11.  
  12. public Server() throws IOException{
  13. serverSocket = new ServerSocket(port,3);
  14. System.out.println("服务器启动!");
  15. }
  16.  
  17. public void service(){
  18. while(true){
  19. Socket socket=null;
  20. try{
  21. socket=serverSocket.accept();
  22. System.out.println("新的连接 "+socket.getInetAddress()+":"+socket.getPort());
  23. }catch(IOException e){
  24. e.printStackTrace();
  25. }finally{
  26. try{
  27. if(socket!=null){
  28. socket.close();
  29. }
  30. }catch(IOException e){
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35. }
  36. public static void main(String[] args) throws IOException, InterruptedException {
  37. // TODO Auto-generated method stub
  38. Server server = new Server();
  39. Thread.sleep(60000*10);
  40. server.service();
  41. }
  42.  
  43. }
  44.  
  45. //Client代码
  46. package Section_03;
  47.  
  48. import java.io.IOException;
  49. import java.net.Socket;
  50. import java.net.UnknownHostException;
  51.  
  52. public class Client {
  53.  
  54. public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
  55. // TODO Auto-generated method stub
  56. int length=100;
  57. String host="localhost";
  58. int port=8001;
  59.  
  60. Socket[] sockets=new Socket[length];
  61. for(int i=0;i<length;i++){
  62. sockets[i]=new Socket(host,port);
  63. System.out.println("第"+(i+1)+"次连接成功!");
  64. }
  65. Thread.sleep(3000);
  66. for(int i=0;i<length;i++){
  67. sockets[i].close();
  68.  
  69. }
  70. }
  71.  
  72. }

  因为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. 服务器远程连接mysql问题解决

    一. centos下解决远程连接不上的问题. 1.查看centos 下防火墙是否关闭: 通过进程: ps -aux |grep firewalld ps -ef |grep firewalld 通过服 ...

  2. PS中10种样式操作

    (1)投影:将为图层上的对象.文本或形状后面添加阴影效果.投影参数由“混合模式”.“不透明度”.“角度”.“距离”.“扩展”和“大小”等各种选项组成,通过对这些选项的设置可以得到需要的效果. (2)内 ...

  3. HCNP - Server

    Server DHCP配置 DHCP服务器配置: 第一种方法:自动配置 路由上面配置网关,开启dhcp服务 [R1]dhcp enable [R1-GigabitEthernet0/0/0]dhcp ...

  4. C#串口通信及数据表格存储

    1.开发环境 系统:win10 开发工具:Visual Studio 2017 2.界面设计 串口通信的界面大致如此,在此基础上添加项目所需的调试指令与数据存储功能,界面排布方面可参考其他教程. 3. ...

  5. 单片机中不带字库LCD液晶屏显示少量汉字

    单片机中不带字库LCD液晶屏如何显示少量汉字,一般显示汉字的方法有1.使用带字库的LCD屏,2.通过SD 卡或者外挂spi flash存中文字库,3.直接将需要的汉字取模存入mcu的flash中. 第 ...

  6. (杭电1019 最小公倍数) Least Common Multiple

    Least Common Multiple Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  7. express函数参数之next

      关于next主要从三点来进行说明:   next的作用是什么? 我们应该在何时使用next? next的内部实现机制是什么?     1.Next的作用 我们在定义express中间件函数的时候都 ...

  8. 解决$ go get google.golang.org/grpc上的包被墙的问题

    今天get grpc包的时候 $ go get google.golang.org/grpc 发现拉不下来被墙了,在github.com上搜索grpc,clone到工程目录中,运行命令 go inst ...

  9. 05-基础widgets

    05-基础widgets 介绍 Widget的功能是"描述一个UI元素的配置数据",Widget并不是表示最终绘制在设备屏幕上的显示元素,而只是显示元素的一个配置数据.Flutte ...

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

    20155215 2016-2017-2 <Java程序设计>第X周学习总结 教材学习内容总结 第六章 继承,避免多个类间重复定义共同行为.子类继承父类,再扩充(extends)其他行为. ...