简体   繁体   中英

Simple Python TCP Server Not Sending the Entire Web Page

I'm a beginner compsci student and I'm trying to code a simple server in python that takes a .HTML page stored in the same directory and sends it to a client on the same network using a TCP connection.

This is my code:

from socket import *

serverPort = 8000
serverSocket = socket(AF_INET, SOCK_STREAM)
# Prepare a sever socket
serverSocket.bind(('', serverPort))  # binds socket to port 8000
serverSocket.listen(1)  # waiting for client to initiate connection

while True:
    # Establish the connection
    print('Ready to serve...')
    connectionSocket, addr = serverSocket.accept()
    try:

        message = connectionSocket.recv(1024)
        filename = message.split()[1]

        f = open(filename[1:].decode())
        outputdata = f.read()

        # Send one HTTP header line into socket
        http_response = 'HTTP/1.1 200 OK\n'

        connectionSocket.send(http_response.encode())

        # Send the content of the requested file to the client
        for i in range(0, len(outputdata)):
            connectionSocket.send(outputdata[i].encode())

        connectionSocket.send("\r\n".encode())
        connectionSocket.close()
    except IOError:
        connectionSocket.send("\r\n".encode())
        # DO LATER
serverSocket.close()
sys.exit()

And this is my simple html page:

<!DOCTYPE html>
<html>
  <body>
    <h1>My First Web Page</h1>

    <p>You have successfully accessed the Web Server</p>
  </body>
</html>

So far whenever I run my server and direct my browser to it, I only get the following served to me:

<p>You have successfully accessed the Web Server</p>

Along with the body and html tags after this. Checking the page source there's no header.

I ran Wireshark while trying to access my server and indeed it seems like I'm only sending through "You have successfully accessed the Web server" and onwards. This is despite the fact a print function shows I am definitely sending all the data in the file through the TCP connection.

Does anyone know what the issue is?

After sending the protocol answer and headers, the actual response comes after two \\r\\n sequences.

Use this fixed code:

from socket import *

serverPort = 8000
serverSocket = socket(AF_INET, SOCK_STREAM)
# Prepare a sever socket
serverSocket.bind(('', serverPort))  # binds socket to port 8000
serverSocket.listen(1)  # waiting for client to initiate connection

while True:
    # Establish the connection
    print('Ready to serve...')
    connectionSocket, addr = serverSocket.accept()
    try:

        message = connectionSocket.recv(1024)
        filename = message.split()[1]

        f = open(filename[1:].decode())
        outputdata = f.read()

        # Send one HTTP header line into socket
        http_response = 'HTTP/1.1 200 OK\n'

        connectionSocket.send(http_response.encode())
        connectionSocket.send("\r\n".encode())
        connectionSocket.send("\r\n".encode())

        # Send the content of the requested file to the client
        for i in range(0, len(outputdata)):
            connectionSocket.send(outputdata[i].encode())

        connectionSocket.close()
    except IOError:
        # DO LATER
serverSocket.close()
sys.exit()

I would use the http.server library

import http.server
import socketserver

PORT = 8080
Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    httpd.serve_forever()

source: https://www.afternerd.com/blog/python-http-server/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM