我是socket编程的新手,我正在尝试理解套接字是如何工作的。目前我正在尝试使用python套接字库来查看它是如何工作的。
现在有一些我无法解决的问题。 让我们举一个例子,如使用Python套接字库用python编写的简单echo客户端和服务器here所示。
echo服务器如下所示 #echo_server.py 导入套接字
# echo_client.py
import socket
host = socket.gethostname()
port = 12345 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.sendall(b'Hello, world')
data = s.recv(1024)
s.close()
print('Received', repr(data))
echo客户端如下所示
{{1}}
我的问题
现在当另一个客户端连接到此服务器时会发生什么? conn和addr变量是否会被新值覆盖?或者它是如何处理的?
是否有一些简单的实例来演示这个?
答案 0 :(得分:0)
现在当另一个客户端连接到此服务器时会发生什么? conn和addr变量是否会被新值覆盖?或者它是如何处理的?
在你的例子中,没有任何有趣的事情会发生。尝试连接将挂起。对connect()
的每次客户呼叫都必须与accept()
的服务器呼叫匹配。由于您只需拨打accept()
一次,因此最多只能连接一个客户端。
如果您希望能够连续接受来自后续客户端的连接,请尝试以下操作:
import socket
host = '' # Symbolic name meaning all available interfaces
port = 12345 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
while True:
conn, addr = s.accept()
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()
如果您希望能够并行接受来自客户端的连接,即。同时来自多个客户,那么您还有更多工作要做。但是,今天你的问题并非如此。
答案 1 :(得分:0)
现在当另一个客户端连接到此服务器时会发生什么? conn和addr变量是否会被新值覆盖?或者它是如何处理的?
正如Rob在另一个答案中指出的那样,您的代码只接受一个客户端。必须为来自客户端的任何连接请求调用accept
。并相应地编码。现在回答你的问题,是的,(conn,addr)对将被覆盖。在再次为新连接调用accept
之前,代码应该注意将它们传递给某个连接线程。
是否有一些简单的实例来演示这个?有一些简单的实例来演示这个吗?
在接受多个客户端的更新代码中,尝试在几次连接后不调用accept
并注意TCP连接状态表(例如netstat
)以查看不同积压值的行为。< / p>