Python 对简单套接字服务器的基本理解
我是套接字编程新手,正在努力理解套接字是如何工作的。目前,我正在尝试使用python套接字库来了解它是如何工作的 现在有几件事我无法理解。 让我们举一个使用python套接字库用python编写的简单echo客户端和服务器的示例 echo服务器如下所示 #echo_server.py 导入套接字Python 对简单套接字服务器的基本理解,python,sockets,networking,tcp-ip,Python,Sockets,Networking,Tcp Ip,我是套接字编程新手,正在努力理解套接字是如何工作的。目前,我正在尝试使用python套接字库来了解它是如何工作的 现在有几件事我无法理解。 让我们举一个使用python套接字库用python编写的简单echo客户端和服务器的示例 echo服务器如下所示 #echo_server.py 导入套接字 host = '' # Symbolic name meaning all available interfaces port = 12345 # Arbitrary non-pr
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)
conn, addr = s.accept()
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()
echo客户端如下所示
# 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))
我的问题
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()
如果您希望能够并行地接受来自客户端的连接,即同时来自多个客户端的连接,那么您有更多的工作要做。但这并不是你今天问题的一部分
现在,当另一个客户端也连接到此服务器时会发生什么?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()
如果您希望能够并行地接受来自客户端的连接,即同时来自多个客户端的连接,那么您有更多的工作要做。但这并不是你今天问题的一部分
现在,当另一个客户端也连接到此服务器时会发生什么?conn和addr变量是否被新值覆盖?或者如何处理
正如Rob在另一个回答中指出的,您的代码将只接受一个客户机。对于来自客户端的任何连接请求,必须调用accept
。并相应地编码。现在来回答您的问题,是的,(conn,addr)对将被覆盖。在再次调用accept
进行新连接之前,代码应注意将它们传递到某个连接线程
是否有一些简单的实例来演示这个?是否有一些简单的实例来演示这个
在更新的用于接受多个客户端的代码中,尝试在几次连接后不调用accept
,并注意TCP连接状态表(例如netstat
),以查看不同积压值的行为
现在,当另一个客户端也连接到此服务器时会发生什么?conn和addr变量是否被新值覆盖?或者如何处理
正如Rob在另一个回答中指出的,您的代码将只接受一个客户机。对于来自客户端的任何连接请求,必须调用accept
。并相应地编码。现在来回答您的问题,是的,(conn,addr)对将被覆盖。在再次调用accept
进行新连接之前,代码应注意将它们传递到某个连接线程
是否有一些简单的实例来演示这个?是否有一些简单的实例来演示这个
在更新的用于接受多个客户端的代码中,尝试在几次连接后不调用
accept
,并注意TCP连接状态表(例如netstat
),以查看不同积压值的行为。是的,在了解如何在内部放置s.accept()使服务器接受多个连接时,可能不是并行的,而是随后以串行方式,这同样是有意义的。但那又有什么好处呢?我的意思是,这与将s.accept()放在外部并让一个客户机单独连接它不一样。是不是当处于while内部时,积压的概念就出现了?如果是的话,有没有一种方法可以证明这一点呢。另外,conn和add变量对于每个accept()又如何呢?它会被每个客户端覆盖吗?记住,s.accept()是对侦听套接字“s”的阻塞调用。当客户端“连接”到侦听套接字时,将创建一个新的套接字,并将其传递回变量/引用“conn”。引用“conn”和“addr”将随着对s.accept()的每次额外调用而获得新的值,与该形式的任何python函数调用一样。我假设backlog允许在拒绝传入请求之前等待接受的传入连接请求的数量