我正在编写一个非常简单的Python套接字程序,以从服务器读取HTML正文。如果创建一个HelloWorld.html文件并使用指定的主机和端口打开它,则可以在具有以下服务器的浏览器中打开该文件,并读取HTML文件中的消息。但是,我在从客户那里读取相同的信息时遇到了麻烦。
服务器
from socket import *
serverSocket = socket(AF_INET,SOCK_STREAM)
host = '127.0.0.1'
port = 6789
serverSocket.bind((host,port))
serverSocket.listen(5)
print("server started...")
(connectionSocket, addr) = serverSocket.accept()
try:
message = connectionSocket.recv(1024).decode()
filename = message.split()[1]
f = open(filename[1:]) # Throws IOError if file not found
print(filename, "found")
connectionSocket.send("HTTP/1.0 200 OK\r\n".encode())
connectionSocket.send("Content-Type: text/html\r\n".encode())
connectionSocket.send(message.encode())
outputdata = f.read()
for i in range(0, len(outputdata)):
connectionSocket.send(outputdata[i].encode())
connectionSocket.send("\r\n".encode())
connectionSocket.close()
print(filename, "delivered")
except IOError:
print(filename, "NOT found")
connectionSocket.send('HTTP/1.0 404 NOT FOUND\r\n')
connectionSocket.close()
print("file not found message delivered")
serverSocket.close()
print("server closed...")
我的服务器似乎正在工作。但是,当我的客户端尝试将HTML对象路径发送到套接字并让服务器读取它时,它似乎没有收到该消息。我刚刚开始使用Python进行套接字编程,并且试图了解服务器如何从套接字接收消息。我最初的想法是,如果我将HTML对象的路径(与客户端和服务器位于同一目录中)发送到套接字,则服务器应该能够读取该信息,将其打开并将该信息返回给客户端。
客户
from socket import *
import sys
client = socket(AF_INET, SOCK_STREAM)
host = sys.argv[1]
port = sys.argv[2]
obj = sys.argv[3]
port = int(port)
client.connect((host, port))
print(client.getsockname())
request = obj
client.send("hello".encode())
client.send(request.encode())
s = client.recv(1024).decode()
print(s)
对于我的客户端,我从命令行参数接受主机,端口和HTML的路径,并建立连接。
当我使用URL http://127.0.0.1:6789/HelloWorld.html 运行HTML文件的浏览器时,服务器响应良好。但是,当我运行服务器并在外壳上使用命令 py capClient.py 127.0.0.1 6789 HelloWorld.html 运行客户端时,它将返回 filename = message.split()[ 1] IndexError:列表索引超出范围错误。我假设此问题来自服务器,无法将来自connectionSocket的消息拆分为可接受的HTML对象路径。
关于修改客户端代码以从服务器接收HTML文件的一些技巧是什么?
答案 0 :(得分:0)
此问题是因为等待message
的字符串是'hello HelloWorld.html'
,但它是'helloHelloWorld.html'
,而split()
会得到列表['helloHelloWorld.html']
,其中索引1不存在。
f = open(filename[1:])
# must be replaced with [1:] give you a list, not string
f = open(filename)
# there needs encode()
connectionSocket.send('HTTP/1.0 404 NOT FOUND\r\n'.encode())