从服务器读取HTML正文的基本python客户端/服务器。

时间:2018-09-29 16:56:15

标签: python html sockets http client-server

我正在编写一个非常简单的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文件的一些技巧是什么?

1 个答案:

答案 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())