试图打开fi时总是出现Python IO错误

2024-10-01 15:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

从命令行

client.py Aaron 12000 HelloWorld.html GET

客户端.py

def main(argv):
    serverName = argv[0]
    serverPort = int(argv[1])
    fileName   = argv[2]
    typeOfHttpRequest = argv[3]
    clientSocket = socket(AF_INET, SOCK_STREAM)
    clientSocket.connect((serverName, serverPort))
    clientSocket.send(typeOfHttpRequest + " " + fileName + " HTTP/1.1\r\n\r\n")
    content = clientSocket.recv(1024)
    print content
    clientSocket.close()

if __name__ == "__main__":
   main(sys.argv[1:])

服务器.py

^{pr2}$

我已经把HelloWorld.html在同一目录中服务器.py但这总是生成一个IOError。有人知道为什么会这样吗?在

  • 这些文件位于C:\Networking中

  • os.getcwd显示C:\Networking

  • 在HelloWorld.html位于C:/networking中/HelloWorld.html

  • 文件名打印正确。

enter image description here


Tags: 命令行py服务器clientmainhtmlcontentfilename
1条回答
网友
1楼 · 发布于 2024-10-01 15:35:12

正如您可能已经注意到的,您试图从URL的开头去掉/,尽管它不在那里。但是,您的代码中还有其他错误,这意味着它的工作方式不像HTTP服务器:

首先,recv()不能保证读取所有的数据,即使总共有1024个字节被写入一个套接字,recv(1024)也只能返回10个字节。因此,最好在循环中执行:

buffer = []
while True:
    data = connection_socket.recv(1024)
    if not data:
        break
    buffer.append(data)

message = ''.join(buffer)

现在消息被保证包含所有内容。在

接下来,要处理请求的标题行,可以使用

^{pr2}$

这样就可以更容易地扩展代码以获得更完整的HTTP支持。在

现在用open,用with语句打开文件:

with open(filename) as f:
    output_data = f.read()

这样可以确保文件也被正确关闭。在

最后,当您响应请求时,您应该使用HTTP/1.0,而不是{},因为您不支持HTTP/1.1的全部功能。而且,即使是OK响应也需要用完整的头来响应,例如:

HTTP/1.1 200 OK
Server: My Python Server
Content-Length: 123
Content-Type: text/html;charset=UTF-8

data goes here....

因此,您的发送例程应该这样做:

if typeOfRequest == 'GET':
    headers = ('HTTP/1.0 200 OK\r\n'
        'Server: My Python Server\r\n'
        'Content-Length: %d\r\n'
        'Content-Type: text/html;charset=UTF-8\r\n\r\n'
        'Connection: close\r\n'
    ) % len(output_data)

    connection_socket.sendall(headers)
    connection_socket.sendall(output_data)

请注意如何使用sendall从字符串发送所有数据。在

相关问题 更多 >

    热门问题