我正在编写2个小程序(服务器和客户端),每当我运行它们,并让客户端连接到服务器时,服务器输出说我连接的端口是我没有绑定的代码。我将服务器和客户端套接字绑定到localhost和端口8000,但每次服务器连接到客户端时,它都说客户端连接到端口52304或其他大于50000的数字,不应该至少是一个恒定的端口号,即使它不是我绑定的那个?另外,我知道,如果我在同一个终端中不止一次运行服务器程序,即使我退出程序,端口仍然被占用,所以我通常运行服务器,退出,然后退出终端,这通常解决那个问题。这是我应该做的另一个注意事项,当我在同一个终端中第二次运行服务器程序时,它会识别出我正在尝试绑定到端口8000并且程序不会运行,然后当它执行时它会选择一些随机端口。 / p>
这是我的服务器代码:
import socket
import os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind('', 8000)
s.listen(5)
while 1:
client,addr = s.accept()
print "Accepted a connection from: ", addr
data = client.recv(1024)
client.send("You said: " + data)
答案 0 :(得分:2)
它报告的端口号是客户端连接的端口号。它将是一个随机端口号。如果(因为你的问题似乎暗示)你在客户端看到一个bind
调用,就像服务器中那样,那么我很惊讶它成功了,因为服务器已经将自己绑定到那个端口而且只有一次可以绑定到给定端口。
请发布您的客户代码。与您的问题所暗示的相反,我不认为您是bind
到客户端的端口。我打赌你只是connect
。现在,一般来说,这就是你应该做的事情。所以你对结果感到困惑的事实只是意味着你并不真正理解究竟发生了什么。你看到的结果是完全可取的和正常的。
以下是对正在发生的事情的解释:
唯一标识TCP连接(全局唯一,因为整个世界中没有其他TCP连接将具有相同的标识符(尽管这对于NAT和私有IP范围确实不是这样))信息:
当您的服务器报告连接时,它会打印出前两个值,因为它们是accept
调用返回的值。当您在服务器中进行bind
调用时,您指定了值3和4.操作系统通常在connect
调用时自动为客户端选择值1和2。
客户端通常不会绑定到端口(尽管它可以)。它通常让操作系统为它选择一个端口。客户端的操作系统将从未使用的端口号列表中选择一个端口号。在客户端的connect
调用中,您将给出值3和4(服务器端bind
调用中指定的值)。操作系统应自动为您分配客户端值1和。
将其视为信封上的发件人和收件人地址。服务器端的accept
呼叫报告发送方地址,因为服务器可能已经知道自己的地址。客户端最关心的是收件人地址(服务器的地址),并让职员(操作系统)只粘贴在返回地址上,
答案 1 :(得分:0)
服务器侦听的端口和套接字与建立连接后使用的套接字不同。当客户端连接发送和接收数据时,accept调用会创建一个新套接字。否则,如果它使用相同的套接字......那么没有其他客户端能够连接。
您还需要正确关闭套接字,以便在程序终止后它不会挂起。
答案 2 :(得分:0)
您永远不能将同一个端口绑定到多个程序,服务器提供的端口是客户端希望您发送数据的端口。我认为这是为了避免连接冲突。
因此,如果建立连接,您不必担心端口。
但如果您希望服务器能够接收更多的连接,请看一下: Multiple simultaneous network connections - Telnet server, Python