2016-05-06 12 views
1

Ich benutze Python-Socket und Epoll, um einen Webserver zu erstellen. Mein Betriebssystem ist Linux CentOS 6, Meine Python-Version ist Python 2.7.8. Mein Quellcode ist:Python-Socket und Epoll

# -*-coding:utf-8-*- 

import socket 
import select 
import time 

EOL1 = b'\n\n' 
EOL2 = b'\n\r\n' 
response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n' 
response += b'Content-Type: text/plain\r\nContent-Length: 13\r\n\r\n' 
response += b'<html><head><title>title</title></head><body><p>Hello, world!</p></body></html>' 

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
serversocket.bind(('0.0.0.0', 8080)) 
serversocket.listen(1) # the number of client that connect to server 
serversocket.setblocking(0) # set 0 not block other block 
serversocket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 

epoll = select.epoll() 
epoll.register(serversocket.fileno(), select.EPOLLIN) 

try: 
    connections = {} 
    requests = {} 
    responses = {} 
    while True: 
     events = epoll.poll(1) 
     for fileno, event in events: 
      if fileno == serversocket.fileno(): # if request come 
       connection, address = serversocket.accept() # waiting income connection 
       connection.setblocking(0) # none block 
       epoll.register(connection.fileno(), select.EPOLLIN) # register socket read event to epoll 
       connections[connection.fileno()] = connection # add connection to connections dict 
       requests[connection.fileno()] = b'' 
       responses[connection.fileno()] = response # write data to responses dict 
      elif event & select.EPOLLIN: # when data in os's read buffer area 
       requests[fileno] += connections[fileno].recv(1024) # read data from connections 
       if EOL1 in requests[fileno] or EOL2 in requests[fileno]: # if http message 
        print('-' * 40 + '\n' + requests[fileno].decode()[:-2]) 
        responses[fileno] += str(time.time()) 
        epoll.modify(fileno, select.EPOLLOUT) # change file number to epoll out mode 
      elif event & select.EPOLLOUT: # if out mode 
       byteswritten = connections[fileno].send(responses[fileno]) # write data to os's write buffer 
       responses[fileno] = responses[fileno][byteswritten:] # get http response message 
       if len(responses[fileno]) == 0: # if file sent 
        epoll.modify(fileno, 0) # change file number to hup mode 
        connections[fileno].shutdown(socket.SHUT_RDWR) # set socket read and write mode shutdown 
      elif event & select.EPOLLHUP: # if message sent and file number in epoll is hup 
       epoll.unregister(fileno) # remove file number from epoll 
       connections[fileno].close() # close connection 
       del connections[fileno] # delete connection from connections dict 
finally: 
    epoll.unregister(serversocket.fileno()) 
    epoll.close() 
    serversocket.close() 

Aber wenn ich Web-Browser öffnen und besuchen „http://localhost:8080/“, bekomme ich einige Daten wie diese <html><head><, ist es nicht vollständige Daten, es ist nur ein Teil meines data.What ist los in meinem Projekt. Mehr Infos sehen Bitte sehen Sie dieses Bild. enter image description here

Antwort

1

Sie haben "Content-Length: 13" in Ihrem Code und daher werden nur die ersten 13 Zeichen angezeigt!

+0

Ja, ich habe es gefunden, ich möchte 130 schreiben, das ist ein Fehler. –

Verwandte Themen