作者clairelune (云风青岚)
看板java
标题[问题] ServerSocket.accept() 回传 new socket?
时间Sun Nov 25 21:17:26 2012
我在学习撰写 server 端程式,
使用了 ServerSocket.accept(5000) 来接受连线。
为了想知道 accept() 後回传的连线 socket ,
其本地端的 port 在哪,我撰写了 Server端程式 (如下)。
Server端 程式码:
ss = new ServerSocket(5000);
sock = ss.accept();
System.out.println("connected !");
System.out.println("sock.toString() : " + sock.toString());
接着在本机上,用 Client端 连线至 Server端,
Server端 输出结果:
connected !
sock.toString() : Socket[addr=/127.0.0.1,port=53835,localport=5000]
其中出现的 53835的port 我想应该是 client 端的 port,
另一个看叙述像是新socket的本地 port,可是怎麽还是在 5000 ?
我看api,说 accept() 会回传 new socket,
看 HeadFirst Java,说 accept() 会回传一个新的 socket (在不同的port上),
但事实让我感到很困惑,请问我的观念上是否有问题?
敬请各位指正,谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.34.173.223
1F:推 PsMonkey:server/client 不要用同一台,搭配 netstat 看一下 11/25 21:46
2F:→ PsMonkey:我觉得你是误解 localport 的意思 see: getLocalPort() 11/25 21:53
我用了两台电脑,server 的那台,
System.out 上的 sock.toString() 输出,localport 还是在 5000上。
不过後来我去 stack overflow 翻文章,也有人提到类似的问题,
结论也 "没有" new socket 一定要开在不同 port 上的说法。
看来我是太相信书了,深入浅出 HeadFirst Java (2nd ed) p.483 上,
说回传的 socket 会在不同的 port上,但事实并非一定如此。
3F:→ cha122977:试试拿2个client端同时去连 看看server上两个port如何 11/26 03:16
呵呵,总算翻到关於 p.483 的讨论串
http://stackoverflow.com/questions/4307549/serversocket-accept-method?rq=1
应该是 HeadFirst Java 写错了。
※ 编辑: clairelune 来自: 1.34.173.223 (11/26 04:11)
4F:→ PsMonkey:手上没书,不过如果是 client 印出来,那的确会不同 port 11/26 09:49
5F:推 keeperkai:刚刚在bsd上面测试了一下 应该说是Server(Master)socket 11/26 21:25
6F:→ keeperkai:和他accept产生出来的Slave socket会在同port上.client 11/26 21:27
7F:→ keeperkai:在自己的机器上会另外占用一个port连向slave socket 11/26 21:28