我正在使用Python编写一个简单的脚本,该脚本将使用套接字连接到主机/端口。我知道套接字只能使用一次,这就是为什么我根本没有关闭套接字,但是当我连接到端口80上的localhost并尝试像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 /
Command:
正如您所看到的,它适用于第一个GET /
但不适用于第二个{{1}}。我该如何解决这个问题?
答案 0 :(得分: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库。您还可以查看此书:Foundations of Python Network Programming。
python文档网站上还有一个很好的socket tutorial可以提供帮助。最后,但并非最不重要的是,我在Google上找到了一个slightly more comprehensive tutorial,对初学者来说非常棒。
HTH。
答案 1 :(得分: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