Python 重用相同的套接字时遇到问题
我正在用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文档网站上还有一个很好的 套接字教程,可以帮助你理解。最后,还有一个我在谷歌上找到的 稍微全面一点的教程,对初学者来说看起来很不错。
希望这些对你有帮助。