Python重复使用同一套接字并遇到问题
我正在使用Python编写一个简单的脚本,它将使用套接字连接到主机/端口。我知道套接字只能使用一次,这就是为什么我根本不关闭套接字,但当我在端口80上连接到localhost并尝试一个简单的命令,如Python重复使用同一套接字并遇到问题,python,http,sockets,tcp,Python,Http,Sockets,Tcp,我正在使用Python编写一个简单的脚本,它将使用套接字连接到主机/端口。我知道套接字只能使用一次,这就是为什么我根本不关闭套接字,但当我在端口80上连接到localhost并尝试一个简单的命令,如GET/时,它第一次工作,但第二次执行GET/或任何其他HTTP命令时,它不会打印输出。这是我的 import socket size = 1024 host = 'localhost' port = 80 def connectsocket(userHost, userPort): s =
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)
导入套接字
大小=1024
主机='localhost'
端口=80
def connectsocket(用户主机、用户端口):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#TCP套接字
s、 连接((用户主机,用户端口))
而(一):
输入=原始输入(“命令:”)
s、 发送(输入+'\r\n\r\n')#发送命令
r=s.recv(尺寸)#接收输出
印刷品(r)
connectsocket(主机、端口)
我假设这是可行的,但下面是一个示例输出:
amartin@homebox:~$ python socketconn.py
Command: GET /
[BUNCH OF HTML CODE]
Command: GET /
Command:
amartin@homebox:~$python socketconn.py
命令:获取/
[一堆HTML代码]
命令:获取/
命令:
正如您所见,它适用于第一个GET/
,但不适用于第二个。如何修复此问题?您需要告诉服务器保持TCP连接打开,并期待更多请求:
headers = 'Connection: keep-alive\r\n'
s.send(input + '\r\n' + headers + '\r\n')
另外,请尝试指定HTTP版本:
python socketconn.py
Command: GET / HTTP/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)
你也可以去图书馆看看。您也可以查看这本书:
python文档网站上还有一个很好的工具,可以提供帮助。最后,但并非最不重要的一点是,我在谷歌上发现了一个非常适合初学者的网站
HTH.这是否适用于所有服务?除了http?编辑:刚试过,似乎不起作用。我尝试过使用标题,但没有成功。上面是HTTP特定的。例如,如果要打开FTP服务器的套接字,则协议完全不同。您是在学习还是在尝试实现某种工具?如果是后者,则需要使用现有库来处理HTTP协议和套接字通信,因为细节可能非常棘手。urllib2
模块就是一个例子。我正在编写一个简单的工具。我希望它是通用的,这样它可以与你连接的任何端口一起工作。如果你想构建一个通用的套接字轮询器,让你可以使用面向行的协议与套接字交互,这听起来是可行的。有点像telnet有一个更高级别的命令集。如果是这样,那么你需要重新回答你的问题。你从哪里得到的套接字只能使用一个?你可以重复使用套接字。我的意思是,如果你关闭了一个套接字,你就不能使用同一个套接字。谢谢你提供的所有信息,我将查看这些链接。另外,这段代码会不会继续用循环打开一个新的套接字?这不会给您一个transport端点已连接
错误吗?不会,因为您已经关闭了端口并在即将结束时关闭了它。一旦执行shutdown()/close()方法,套接字就不再连接。我明白了。s=socket.socket(socket.AF\u INET,socket.SOCK\u STREAM)
是否需要在while
循环中?