简单插座基本知识

2024-05-05 15:01:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

echo服务器如下所示 #回声_服务器.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客户端如下所示

^{pr2}$

我的问题

  1. 回音_服务器.py当我说conn时,addr=s.accept(),accept()做两件事。1并返回客户端的ip地址(地址2)。它创建了一个新的套接字(称为client socket),可以在这里使用conn引用它,并用于与连接的客户端交互。

    Now what happens when another client also connects to this server? Does the conn and addr variables get overwritten with the new values? Or how is it handled?

  2. 又是回声_服务器.py,s.listen(1)建议最多允许1个backlog,我只从理论上理解,这是服务器在忙于处理已连接的客户端时,服务器希望允许在队列中等待的最大客户端数。

    Is there some simple practical example to demo this ?


Tags: pyecho服务器clienthost客户端dataport
2条回答

Now what happens when another client also connects to this server? Does the conn and addr variables get overwritten with the new values? Or how is it handled?

在您的例子中,不会发生任何有趣的事情。尝试连接将挂起。对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()

如果您希望能够并行地接受来自客户端的连接,即同时从多个客户端接收连接,那么您还有更多的工作要做。但这并不是你今天的问题。在

Now what happens when another client also connects to this server? Does the conn and addr variables get overwritten with the new values? Or how is it handled?

正如Rob在另一个答案中指出的,您的代码将只接受一个客户机。必须为来自客户端的任何连接请求调用accept。并相应地编码。现在来回答你的问题,是的,(conn,addr)对将被覆盖。在再次调用accept进行新连接之前,代码应该负责将它们传递给某个连接线程。在

Is there some simple practical example to demo this ?s there some simple practical example to demo this ?

在用于接受多个客户端的更新代码中,尝试在几个连接之后不调用accept,并注意TCP连接状态表(例如,netstat)以查看backlog的变化值的行为。在

相关问题 更多 >