Python 对简单套接字服务器的基本理解

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

我是套接字编程新手,正在努力理解套接字是如何工作的。目前,我正在尝试使用python套接字库来了解它是如何工作的

现在有几件事我无法理解。 让我们举一个使用python套接字库用python编写的简单echo客户端和服务器的示例

echo服务器如下所示 #echo_server.py 导入套接字

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))
我的问题

  • 在echo_server.py中,当我说conn,addr=s.accept()时,accept()做两件事。1.它返回连接客户端的地址(ip和端口),该地址存储在addr和2中。它创建了一个新的套接字(称为客户端套接字),可在此处使用conn引用该套接字,并用于与连接的客户端交互。 现在,当另一个客户端也连接到此服务器时会发生什么?conn和addr变量是否被新值覆盖?或者如何处理

  • 同样在echo_server.py中,s.listen(1)表示最多允许1个待办事项,我似乎仅从理论上理解,这是服务器在忙于处理已连接的客户端时,服务器希望允许在队列中保持等待的最大客户端数。 是否有一些简单的实际例子来演示这一点

  • 现在,当另一个客户端也连接到此服务器时会发生什么?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变量是否被新值覆盖?或者如何处理

    在您的示例中,不会发生任何有趣的事情。连接的尝试将挂起。对
    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允许在拒绝传入请求之前等待接受的传入连接请求的数量