基本了解简单套接字服务器

时间:2016-09-17 00:27:02

标签: python sockets networking tcp-ip

我是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}}

我的问题

  1. 在echo_server.py中,当我说conn,addr = s.accept()时,accept()会做两件事。 1.它返回连接客户端的地址(ip和端口),它存储在addr和2.它创建一个新的套接字(称为客户端套接字),可以使用conn在这里引用,用于与连接的客户端进行交互。
      

    现在当另一个客户端连接到此服务器时会发生什么? conn和addr变量是否会被新值覆盖?或者它是如何处理的?

  2. 再次在echo_server.py中,s.listen(1)建议允许最多1个待办事项,我似乎只理解理解它是服务器希望等待的最大客户端数量当服务器忙于处理已连接的客户端时,在队列中。
      

    是否有一些简单的实例来演示这个?

2 个答案:

答案 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>