Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python重复使用同一套接字并遇到问题_Python_Http_Sockets_Tcp - Fatal编程技术网

Python重复使用同一套接字并遇到问题

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 =

我正在使用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)

导入套接字
大小=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
循环中?