1
from socket import *
from time import ctime


HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
    print 'waiting for connection...'
    tcpCliSock, addr = tcpSerSock.accept()
    print "...connected from:", addr

    while True:
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        tcpCliSock.send("[%s] %s" % (ctime(), data))

    tcpCliSock.close()
tcpSerSock.close()

我有很多错误清除了它们。我正在关注核心 Python 应用程序书。我需要知道循环中发生了什么?

tcpCliSock, addr = tcpSerSock.accept() 

这行代码到底做了什么?“等待连接?” 与谁以及如何?没有提供其他参数来连接某些东西!这个 listen() 究竟是如何工作的?简述程序。谢谢

4

1 回答 1

1

文档中的 Python Sockets HOWTO 描述了您想要的内容。这是 Python 2 版本:

http://docs.python.org/2/howto/sockets.html

简短的版本是您发布的代码是一个简单的服务器,它被配置为响应来自可能在不同机器上的单独进程的请求,该进程向它发送一小块数据。该服务器将带有时间戳的数据发回。

socket.listen()用于设置一个套接字来接收传入的连接。连接请求进入一个短队列并按顺序处理。 socket.accept()检查该侦听队列中是否有传入连接,如果有,它会为另一台机器打开一个新套接字,以处理该连接。当连接结束时,第一个客户端的新套接字关闭,服务器套接字继续处理队列中的下一个连接。

要让这个服务器做任何事情,你需要使用一些客户端程序来打开正确的端口并向它发送消息。对于这么简单的事情,telnet如果它安装在您的机器上,您可以尝试使用。运行此服务器,然后尝试:

telnet localhost 21567

在同一台机器上并开始输入一些文本。您应该看到响应。我的输出如下所示:

$ telnet localhost 21567
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
j
[Sun Sep 15 11:58:27 2013] j
jkl
[Sun Sep 15 11:58:29 2013] jkl
fdjksla;
[Sun Sep 15 11:58:30 2013] fdjksla;
fdjkasl;fjdksal;fjkdsa;
[Sun Sep 15 11:58:32 2013] fdjkasl;fjdksal;fjkdsa;

注意:您必须在HOST字段中输入主机名才能使其正常工作。试试看'localhost'是否有帮助。另外,我相信如果您将localhost其用作HOST参数,您可能无法接收来自其他机器的连接。在这种情况下,您需要在网络上使用您自己的本地主机名或 IP 地址。

我已经使用固定缩进和参数编辑了 OP 'localhost'HOST并测试了它是否可以telnet在另一个 shell 中使用,正如我在这里描述的那样。

我还注意到此代码永远不会到达close()服务器套接字。如果您想关闭服务器并以有序的方式退出,则需要break在外部循环中的某个位置。while

于 2013-09-15T18:51:00.143 回答