作者Killercat (杀人猫™)
看板java
标题Re: [问题] socket写活的
时间Tue Nov 19 10:41:18 2013
※ 引述《LaPass (LaPass)》之铭言:
: ※ 引述《dremel (hadoop)》之铭言:
不要用单纯的raw socket, 稍微看一下TCP的listen/accept是怎麽实做的
去改一下TCP的实作方法
Server端来说
a TCP开一个socket port
b TCP等着这个socket port收讯息(listening)
c TCP收到Client讯息(accept), 开一个新的socket port并且告诉client该port
d TCP断开该client连结 继续listening, 新的socket port喂client资料
Client端来说(分别对应上面的abcd)
a Client开一个socket port
b Client连结某个listening的TCP socket port
c 收到Server告诉你的接下来要跟谁接头的port number
d 从该port number取得服务
实作上的scenario的资料交换可以是这样(一样对应abcd)
a server开一个listening port, 等着收档名
b client传送档名到server, 可能格式就是"file://tcp.jpg<CR><LF><CR><LF>"
CR LF是档案传输中很常见的boundary, 可以google一下
c server收到client需求,回传status code跟port number
可以是JSON 也可以是任何格式 比方说"OK<CR><LF><CR><LF>10422"
然後打开10422 port, 开一个worker thread等着把tcp.jpg转成binary
d client收到讯息得知1. server有档案(所以回传OK) 2. 我该跟10422port拿
所以开一个socket port连接10422, 开始收binary.
其中所有server/client的沟通就是称为protocol, 比方说client先跟server说
"我需要一个tcp.jpg" server会跟client说"ok 去跟10422 port拿"
这些都可以自己定义 自己练习 甚至可以做一些很有趣的改变
比方说我不是跟10422拿 我可以跟另外一组ip去接洽
在Java实作TCP Server协定的是java.net.ServerSocket
(不过在实作练习这个的时候请用socket来做,
只是告诉你ServerSocket额外帮你做了什麽)
两边都用Socket先做做看 练习怎麽用Socket来做Client/Server沟通
以及为什麽Server要用这种迂回的listen/accept模式
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.124.251.135
1F:推 popcorny:Server/Client的c的步骤都不需要,用原来的socket回传就可 11/19 11:10
2F:→ Killercat:c的步骤是accept的handover o_o d并没有额外再开socket 11/19 11:15
3F:→ Killercat:c是server开好socket後 用原来的socket告诉client新port 11/19 11:16
4F:推 popcorny:那也不需要告诉client port,因为那还是原先的port 11/19 11:22
5F:→ Killercat:告诉client port 我接下来要传送binary给你用哪个port 11/19 11:24
6F:→ Killercat:原来的port才能继续listen 接受别的client的request 11/19 11:26
7F:→ popcorny:不需要哟.不用另开socket/port也可以accept其他的request 11/19 11:26
8F:→ Killercat:那是因为ServerSocket帮你做掉了..... 11/19 11:27
9F:→ Killercat:看看ServerSocket.accept()回传值吧 o_o/ 11/19 11:28
10F:→ popcorny:只要是不同的[ip,src_port,dest_port]就视为不同socket 11/19 11:28
※ 编辑: Killercat 来自: 59.124.251.135 (11/19 11:29)
11F:→ popcorny:你可以用wireshark去监听封包看,accept後还是同个port 11/19 11:30
12F:→ popcorny:或是把accept回的socket印出来也可以看的出port有没有换 11/19 11:32
13F:→ sbrhsieh:不可能两边都只用 socket 来做。 11/19 13:40
14F:→ Killercat:看了一下 应该上面两位都没说错 感谢指正~ 11/21 15:15