没有合适的资源?快使用搜索试试~ 我知道了~
首页Java ServerSocket用法详解
资源详情
资源评论
资源推荐
3.1 构造 ServerSocket
ServerSocket 的构造方法有以下几种重载形式:
ServerSocket()throws IOException
ServerSocket(int port) throws IOException
ServerSocket(int port, int backlog) throws IOException
ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
在以上构造方法中,参数 port 指定服务器要绑定的端口(服务器要监听的端口),参数
backlog 指定客户连接请求队列的长度,参数 bindAddr 指定服务器要绑定的 IP 地址。
3.1.1 绑定端口
除了第一个不带参数的构造方法以外,其他构造方法都会使服务器与特定端口绑定,该端
口由参数 port 指定。例如,以下代码创建了一个与 80 端口绑定的服务器:
ServerSocket serverSocket=new ServerSocket(80);
如果运行时无法绑定到 80 端口,以上代码会抛出 IOException,更确切地说,是抛出
BindException,它是 IOException 的子类。BindException 一般是由以下原因造成的:
端口已经被其他服务器进程占用;
在某些操作系统中,如果没有以超级用户的身份来运行服务器程序,那么操作系统不允许
服务器绑定到 1~1023 之间的端口。
如 果把参数 port 设为 0,表示由操作系统来为服务器分配一个任意可用的端口。由操作系
统分配的端口也称为匿名端口。对于多数服务器,会使用明确的端口,而 不会使用匿名端
口,因为客户程序需要事先知道服务器的端口,才能方便地访问服务器。在某些场合,匿
名端口有着特殊的用途,本章 3.4 节会对此作介绍。
3.1.2 设定客户连接请求队列的长度
当服务器进程运行时,可能会同时监听到多个客户的连接请求。例如,每当一
个客户进程执行以下代码:
就意味着在远程
主 机的 端口上,监听到了一个客
户的连接请求。管理客户连接请求的任务是由操作系统来完成的。操作系统把
这些连接请求存储在一个先进先出的队列中。许多操 作系统限定了队列的最大
长度,一般为 。当队列中的连接请求达到了队列的最大容量时,服务器进程
所在的主机会拒绝新的连接请求。只有当服务器进程通过 的
方法从队列中取出连接请求,使队列腾出空位时,队列才能继续加入
新的连接请求。
对于客户进程,如果它发出的连接请求被加入到服务器的队列中,就意味着客
户与服务器的连接建立成功,客户进程从 构造方法中正常返回。如果
客户进程发出的连接请求被服务器拒绝, 构造方法就会抛出
。
构造方法的 参数用来显式设置连接请求队列的长度,
它将覆盖操作系统限定的队列的最大长度。值得注意的是,在以下几种情况中,
仍然会采用操作系统限定的队列的最大长度:
! 参数的值大于操作系统限定的队列的最大长度;
! 参数的值小于或等于 ;
!在 构造方法中没有设置 参数。
以下例程 "#$ 的 和例程 "#% 的 用来演示服务器的连
接请求队列的特性。
例程 "#$!
&'
( )
( *&+,
)
- $
. .
!!!+,+ ,
/0 11)!!!!22试图建立 $ 次连接
+,
3&( .第.11$1.次连接成功.
4
5* "
/0 11)
+, !!!!!22断开连接
4
4
4
例程 "#%!
&'
&'
( )
!( 67)
"!!!22连
接请求队列的长度为 "
3&( .服务器启动.
4
!( *)
()
(
3)
!!!!22从连接请求队
列中取出一个连接
3&( .8*.
1
69**1.:.1;
467)
5
4- 3)
3)
/<(
467)54
4
4
4
!( *&+,
)
5* ='$!!!!!22睡眠 $ 分钟
22
4
4
试图与 进行 $ 次连接。在 类中,把连接请求队列的
长度设为 "。这意味着当队列中有了 " 个连接请求时,如果 再请求连接,
就会被 拒绝。下面按照以下步骤运行 和 程序。
($) 把 类的 &方法中的“>这行程序代码注释
掉。这使得服务器与 端口绑定后,永远不会执行
方法。这意味着队列中的连接请求永远不会被取出。
先运行 程序,然 后再运行 程序, 程序的打印结果如下:
第 $ 次连接成功
第 % 次连接成功
第 " 次连接成功
*.&.
:/(*:
; 6& 8
?*
; 6& *@
(
; 6& 59**@
(
; 6& @
(
6& @
(
@(
@(
0A@(
0A@(
& :$
从以上打印结果可以看出, 与 在成功地建立了 " 个连接后,就
无法再创建其余的连接了,因为服务器的队列已经满了。
(%)把 类的 &方法按如下方式修改:
( *&+,
)
225* ='$!22睡眠 $ 分钟
4
作 了以上修改,服务器与 端口绑定后,就会在一个 循环中不断执
行 方法,该方法从队列中取出连接请求,使得队列能
及时腾 出空位,以容纳新的连接请求。先运行 程序,然后再运行
程序, 程序的打印结果如下:
第 $ 次连接成功
第 % 次连接成功
第 " 次连接成功
B
第 $ 次连接成功
从以上打印结果可以看出,此时 能顺利与 建立 $ 次连接。
3.1.3 设定绑定的 IP 地址
如果主机只有一个 IP 地址,那么默认情况下,服务器程序就与该 IP 地址绑 定。
ServerSocket 的 第 4 个 构 造 方 法 ServerSocket(int port, int backlog, InetAddress
bindAddr)有一个 bindAddr 参数,它显式指定服务器要绑定的 IP 地址,该构造方法
适用于具有多个 IP 地址的主机。假定一个主机有两个网卡, 一个网卡用于连接到
Internet, IP 地址为 222.67.5.94,还有一个网卡用于连接到本地局域网,IP 地址为
192.168.3.4。如果服务器仅仅被本地局域网中的客户访问,那 么可以按如下方式创
建 ServerSocket:
ServerSocket serverSocket=new ServerSocket(8000,10,InetAddress.getByName
("192.168.3.4"));
3.1.4 默认构造方法的作用
有一个不带参数的默认构造方法。通过该方法创建的
不与任何端口绑定,接下来还需要通过 *方法与特定端口
绑定。
这个默认构造方法的用途是,允许服务器在绑定到特定端口之前,先设置
的一些选项。因为一旦服务器与特定端口绑定,有些选项就不
能再改变了。
在以下代码中,先把 的 7CD@9EED 选项设为 (,然
后再把它与 端口绑定:
D(9**(!!!!!22设置
的选项
*
69**!!22与 端口绑定
如果把以上程序代码改为:
D(9**(!!!!!22设置
的选项
那么 D(9**(方法就不起任何作用了,因为
7CD@9EED 选项必须在服务器绑定端口之前设置才有效。
3.2 接收和关闭与客户的连接
的 方法从连接请求队列中取出一个客户的连接请求,
然后创建与客户连接的 对象,并将它返回。如果队列中没有连接请求,
方法就会一直等待,直到接收到了连接请求才返回。
接下来,服务器从 对象中获得输入流和输出流,就能与客户交换数据。
当服务器正在进行发送数据的操作时,如果客户端断开了连接,那么服务器端
会抛出一个 67 的子类 异常:
:3
这只是服务器与单个客户通信中出现的异常,这种异常应该被捕获,使得服务
器能继续与其他客户通信。
以下程序显示了单线程服务器采用的通信流程:
( *)
()
(
3)
!!!22从连接请求队
列中取出一个连接
3&( .8*.
1
69**1.:.1;
22接收和发送数据
B
467)
22这只是与单个客户通信时遇到的异常,可能是由于客户
端过早断开连接引起的
22这种异常不应该中断整个 循环
剩余29页未读,继续阅读
coopery
- 粉丝: 1
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1