不是在这里发布一英里长的脚本,而是一个简短的示例:我正在两台运行以下脚本之一的计算机之间创建TCP / IP连接:
服务器:
private int compress(int hashCode) {
return Math.abs(hashCode) % capacity;
}
客户:
# server.py
import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print 'Connection from', addr
c.close()
这给了我一个像这样的准备:
#client.py
import socket
s = socket.socket()
host = socket.socket()
port = 1234
s.connect((host, port))
print s.recv(1024)
什么控制着54451-54454数字的创建?我明白这是什么;分配给客户端连接的端口号。我似乎无法弄清楚如何控制数字,或至少控制其发出的范围。
这甚至可能吗?任何建议将极大地帮助您。预先谢谢你。
答案 0 :(得分:0)
通常,如果您自己没有分配端口ID,则您的OS或运行时系统会这样做。
尤其是 TCP每个连接具有两个端口:源端口和目标端口,有时称为本地端口和远程端口。使用s.bind
可以在服务器上设置 local 端口,而无需设置任何远程端口(这很有意义:尚无实际连接)。使用s.connect
可以在客户端上设置远程(目标)端口,而无需设置任何 local 端口。
当您的客户端向服务器发送连接请求时,您的客户端需要一个本地端口。由于还没有,操作系统或运行时系统之类的东西会从可用端口ID池中拾取。然后,它将该ID绑定到客户端套接字s
的本地端,并使用以下命令发出请求(我在这里假设使用192.168 RFC-1918专用地址空间):
<local-addr=192.168.xxx.xxx, local-port=54451, remote-addr=S, remote-port=1234>
(其中S是服务器的IP地址)。
服务器看到传入的请求,并使用以下命令创建一个 new 套接字:
<local-addr=S, local-port=1234, remote-addr=192.168.xxx.xxx, remote-port=54451>
您可以看到,这是一对IPaddr +端口号,只是交换了一下。
该 new 套接字是s.accept
在服务器上返回的内容,形式为c
。
如果要在客户端上分配自己的本地端口,也可以在呼叫bind
之前在此呼叫connect
:
s.bind((0, port))
(零表示“未分配”,因此未设置本地IP地址。您可以设置特定的IP地址,如果主机是多宿主的,则很有用。)