Python 重用相同的套接字时遇到问题

1 投票
2 回答
4494 浏览
提问于 2025-04-16 13:12

我正在用Python写一个简单的脚本,目的是通过一个套接字连接到一个主机和端口。我知道套接字只能用一次,所以我根本没有关闭它。但是,当我连接到本地主机的80端口,并尝试执行一个简单的命令,比如GET /时,第一次能成功,但第二次执行GET /或者其他任何HTTP命令时,就没有输出了。以下是我的代码:


import socket
size = 1024
host = 'localhost'
port = 80
def connectsocket(userHost, userPort):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #TCP socket
    s.connect((userHost, userPort))
    while(1):
        input = raw_input("Command: ")
        s.send(input + '\r\n\r\n') #Send command
        r = s.recv(size) #Recieve output
        print(r)
connectsocket(host, port)

我本以为这样会有效,但这是一个示例输出:


amartin@homebox:~$ python socketconn.py
Command: GET /
[BUNCH OF HTML CODE]
Command: GET /

命令:

如你所见,第一次GET /是成功的,但第二次就不行了。我该怎么解决这个问题呢?

2 个回答

0

你需要告诉服务器保持TCP连接打开,并且期待更多的请求:

headers = 'Connection: keep-alive\r\n'
s.send(input + '\r\n' + headers + '\r\n')

另外,试着指定一下HTTP的版本:

python socketconn.py 
Command: GET / HTTP/1.1
1

根据@samplebias的回答中的评论信息,我觉得这和你想要实现的目标很相似:

import errno
import socket

size = 1024
host = 'localhost'
port = 80


def connectsocket(userHost, userPort):

    while(1):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP socket
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.connect((userHost, userPort))

        command = raw_input("Command: ")

        s.send(command + '\r\n\r\n')  # Send command
        response = s.recv(size)  # Recieve output
        print response

        try:
            s.shutdown(socket.SHUT_RDWR)
        except socket.error, exc:
            # Depending on the platform, shutting down one half of the
            # connection can also close the opposite half
            if exc.errno != errno.ENOTCONN:
                raise

        s.close()


connectsocket(host, port)

你可能还应该看看 Twisted 这个库。你也可以参考这本书: Python网络编程基础

此外,Python文档网站上还有一个很好的 套接字教程,可以帮助你理解。最后,还有一个我在谷歌上找到的 稍微全面一点的教程,对初学者来说看起来很不错。

希望这些对你有帮助。

撰写回答