现在这里是socket的服务器部分的示例。 我想让serverSocket和connectionSocket具有不同的端口号,但是现在,它们使用相同的端口号。
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind((‘’,serverPort))
serverSocket.listen(1)
print (‘The server is ready to receive’)
while 1:
connectionSocket, addr = serverSocket.accept()
sentence = connectionSocket.recv(1024)
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence)
connectionSocket.close()
如果他们使用相同的端口号,是否会发生冲突?
答案 0 :(得分:1)
没有什么可以避免的,并且确实没有简单的方法可以避免它 - 这就是TCP应该如何工作的方式。
在TCP中有两种套接字:
服务器套接字开始使用listen
侦听传入连接;并等待与accept
的客户端连接。客户端创建一个连接到服务器地址(host, port)
的套接字。当服务器accept
成为连接时,会在(client_address, client_port)
和(server_address, server_port)
之间创建新连接套接字。如果数据包是连接请求,或者发往已连接的套接字,则服务器上的TCP堆栈可以轻松地从状态位查看。如果是已连接的套接字之间的通信,则它会找到绑定在本地地址上的文件描述符,本地端口和与源端口,远程端的源端口连接。 / p>
连接的套接字与侦听服务器套接字具有相同的端口;套接字的Ende知道4件事:本地地址,本地端口,远程地址和远程端口。您可以在10.20.30.40:12345
上绑定1个服务器套接字,同时将数千个套接字从10.20.30.40:12345
连接到数千个不同的地址。
仅在连接尝试阶段存在拥塞; server_socket.listen(1)
表示服务器只排队1个传入连接;后续连接将被拒绝,直到接受传入连接。
来自Linux手册页,listen(2)
backlog
参数sock.listen
上的ECONNREFUSED
:
backlog参数定义了最大长度 sockfd的挂起连接队列可能会增长。如果在队列满时到达连接请求,则客户端可以 收到错误,显示{{1}}或者,如果是 底层协议支持重传,请求可能是 忽略,以便稍后重新连接成功。
答案 1 :(得分:0)
Althouh我从来没有在Python中使用过原始套接字,我想这个问题更普遍地涉及TCP和IP如何工作。
当服务器侦听端口上的连接时,客户端将连接到那个端口,并且可以通过四重(server_addr,server_port,client_addr,client_port)识别TCP连接< / em>,因此当发送或接收属于不同连接的数据包时没有歧义,因为(client_addr,client_port)部分对于每个数据包都是不同的。
也就是说,寻址没有冲突。
但是,请注意,服务器在接受每个请求后派生(或生成一个线程)是很常见的,这样主进程(或线程)可以保持acceprint连接,而其他连接由分叉进程(或线程)处理。在您的情况下,相反,一旦您的服务器开始处理请求,它会在再次调用accept()
之前计算响应,因此任何其他客户端必须等待其服务请求之前。