快速业务通道

Java网络编程从入门到精通(29):服务端Socket的选项 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21

执行下面的命令:

java server.TestReuseAddr2

连续执行5次下面的命令:

telnet localhost 1234

执行结果:

ServerSocket1:Socket[addr=/127.0.0.1,port=11724,localport=1234] ServerSocket3:Socket[addr=/127.0.0.1,port=11725,localport=1234] ServerSocket5:Socket[addr=/127.0.0.1,port=11726,localport=1234] ServerSocket2:Socket[addr=/127.0.0.1,port=11727,localport=1234] ServerSocket4:Socket[addr=/127.0.0.1,port=11728,localport=1234]

上面的运行结果只是一种可能,如果多次按着上面的步骤操作,可能得到不同的运行结果。由此可以断定,当多个ServerSocket对象同时绑定一个端口时,系统会随机选择一个ServerSocket对象来接收客户端请求。但要注意,这个接收客户端请求的ServerSocket对象必须关闭(如019行如示),才能轮到其他的ServerSocket对象接收客户端请求。如果不关闭这个ServerSocket对象,那么其他的ServerSocket对象将永远无法接收客户端请求。读者可以将 serverSocket.close()去掉,再执行上面操作步骤,看看会有什么结果。

三、SO_RCVBUF选项

可以通过SeverSocket类的两个方法(setReceiveBufferSize和getReceiveBufferSize)来设置和获得SO_RCVBUF选项的值,这两个方法的定义如下:

public synchronized void setReceiveBufferSize (int size) throws SocketException public synchronized int getReceiveBufferSize() throws SocketException

其中size参数表示接收缓冲区的大小,单位是字节。设置了ServerSocket类的SO_RCVBUF选项,就相当于设置了Socket对象的接收缓冲区大小。这个Socket对象是由accept返回的。下面积代码演示了如何使用这两个方法来设置和获得接收缓冲区的大小:

package server; import java.net.*; public class TestReceiveBufferSize {      public static void main(String[] args) throws Exception      {          ServerSocket serverSocket = new ServerSocket(1234);          serverSocket.setReceiveBufferSize(2048); // 将接收缓冲区设为2K          while (true)          {              Socket socket = serverSocket.accept();              // 如果客户端请求使用的是本地IP地址,重新将Socket对象的接              // 收缓冲区设为1K                          if (socket.getInetAddress().isLoopbackAddress())                  socket.setReceiveBufferSize(1024);              System.out.println("serverSocket:"                              + serverSocket.getReceiveBufferSize());              System.out.println("socket:" + socket.getReceiveBufferSize());              socket.close();          }      } }

执行如下命令:

java server.TestReceiveBufferSize 执行如下三个命令 (192.168.18.100为本机IP地址): telnet 192.168.18.100 1234 telnet localhost 1234 telnet 192.168.18.100 1234

运行结果:

serverSocket:2048 socket:2048 serverSocket:2048 socket:1024 serverSocket:2048 socket:2048

从上面的运行结果可以看出,在执行telnet localhost 1234命令后,由于localhost是本地地址,因此程序通过将Socket对象的接收缓冲区设为1024,而在执行其他两条命令后,由于192.168.18.100不是本机地址,所以Socket对象的接收缓冲区仍然保留着

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号