实验目的
观察Java socket的实际端口交互。
实验截图
用netstat来不断监听端口10001
没有任何端口事件时的初始状态。
客户端主动发起连接
端口被设置为SYN_SENT的同步位。等待服务器发送同步信息过来。
server端主动发起连接请求,等待client与之连接,这是无限期等待的。
端口被置为LISTENING(正在监听)。当client回应请求后,连接便建立起来。
有一个细节,不知道为什么他先建立起监听的居然是ipv6的监听。
为什么不是ipv4呢?不明白。
socket建立起了连接。
监听的端口开始转向ESTABLISHED(已建立)状态。
socket双方可以通信了。
当client主动放弃连接时,所有监听取消。
Java socket封装下,在关闭时,直接双方先后互发关闭请求应答包,直接结束。
端口恢复。
当server主动放弃连接时
同样地,端口恢复正常。
尝试用socket作server,telnet作client
![](http://hi.csdn.net/attachment/201107/16/0_1310798128zzAw.gif)
同样,client主动发起的请求都会很快夭折
![](http://hi.csdn.net/attachment/201107/16/0_13107981442Gz8.gif)
开了两个telnet连接socket server
建立成功。
细节:server只有一个,端口是10001
client有两个,端口是52690和52693
//-本来是有52690和52693的图的,但是上传的时候总上传不了,这张是先前的实验的,设备、环境都一样。
//-先看着吧-,-
关了一个telnet
server端口被置为CLOSE_WAIT(结束的时候的,三次握手啊)
client端口被置为FIN_WAIT_2(直接是2了,这速度。。。)
另一个也关了
握手等待时间过去后,第一个关闭的telnet端口恢复正常。
直接把 server端关了
所有应用到的端口重新置位。
完事。
查看端口的脚本
for /L %%1 in (1,1,9999) do (
netstat -a |find"10001"
)
或者直接用以下shell:
for /L %i in (1,1,999) do netstat-a|find "10001"
总结:
1. JAVA在处理的socket机制是基于本地系统实现的,所以没什么特别的,只是证明了一下,他的确这样做的。
2. 对了server 和client分别发起连接请求时候,端口情况的观察表明,c/s模式下,服务器才是老大。server端口持续监听,而client端则敏捷取消。