【问题标题】:TCP multi threading web server in pythonpython中的TCP多线程Web服务器
【发布时间】:2017-03-05 12:34:53
【问题描述】:

我创建了一个 TCP 多线程网络服务器,但它给了我以下信息 如果找到文件 1.它说“int obj没有属性编码” 2.稍后会显示list index out of range

如果找不到文件 1. 网页浏览器不显示html错误信息 2.稍后会显示list index out of range

我的服务器代码是

import socket
import threading
import os
import sys

#to convert bytes into string 
def bytestoString(stringToRead):
        stringToRead = bytes.decode(stringToRead)
        type(stringToRead)
        return(stringToRead)

#to conver string into bytes
def stringToBytes(bytesToSend1):
        bytesToSend1= str.encode(bytesToSend1)
        type (bytes)
        return(bytesToSend1)
#to retreive a file
def retrFile(name,sock):
    message=sock.recv(1024)
    message_string = bytestoString(message)
    print(message_string)
    fileName=message_string.split()[1]
    fileName=fileName.split("/")[1]
    #stringLength=len(fileName)
    print(fileName)

    if os.path.isfile(fileName):
        print ('Ready to send the file................')
        with open(fileName,'rb') as fileRead:
            data= fileRead.read()
            print (data)
            exists_Bytes=stringToBytes('HTTP/1.1 200 OK\nContent-type=text/html')
            sock.send(exists_Bytes)
            for i in range(0 ,len(data)): 
                sock.send((data[i]).encode())
            print('file sent succesfully')
            sock.close()
    else :
        httpResponse=stringToBytes('HTTP/1.1 404 not Found')
        sock.send(httpResponse)
        #errorDisplayPage=stringToBytes('<html><title>404 Error</title><body>404 Error- Page cannot be found </body></html>')
        sock.send(b'<html><title>404 Error</title><body>404 Error- Page cannot be found </body></html>')
        print ('error message displayed')  
        sock.close()


def Main(serverPort):
    #creating a server socket type TCP
    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    localHost=socket.gethostname()
    #binding the server to the client
    serverSocket.bind((localHost,serverPort))

    serverSocket.listen(5)

    print ('***Server is ready to recieve***')

    while True:

        connectionSocket, addr = serverSocket.accept()
        print ('got connection from:<', addr,'>')
        t=threading.Thread(target=retrFile,args=('retrThread',connectionSocket))
        t.start()
    connectionSocket.send('thank you for connecting')
    connectionSocket.close()


if __name__ == '__main__':
    #getting server hostname and port number from the user
    serverPort=int(sys.argv[1])
    Main(serverPort)

【问题讨论】:

  • 您能否更具体一点,并添加整个错误消息和产生错误的行?
  • 引发错误的行是 line 37. sock.send((data[i]).encode())
  • 你使用的是 Python 3 还是 Python 2?
  • 我正在使用 python 3

标签: python multithreading tcp


【解决方案1】:

您已在代码中将文件作为二进制文件打开:

with open(fileName,'rb') as fileRead:
    data= fileRead.read()

不过,稍后你会尝试做一些有趣的事情。现在,这在 Python 2 和 3 中有所不同。您使用的是 Python 3,因此以下代码块存在问题:

for i in range(0 ,len(data)): 
    sock.send((data[i]).encode())

在 python 2 中,您将遍历单个字符,它会正常工作。但是,在 python 3 中,您正在迭代 bytes 对象,因此 data[i] 将是 int 对象。

相反,您可以:

sock.sendall(data)

同样根据wikipedia,HTTP 协议假定状态行后跟一个空行。这就是为什么您看不到错误消息,也不会看到该文件的原因。

所以,用"\n\n" 后缀你的状态码,比如:'HTTP/1.1 404 not Found\n\n'。 OK 消息也是如此。

【讨论】:

  • @prachi 没问题。如果答案解决了您的问题,您可以通过将其标记为已接受来表示感谢,这样其他人也将从中受益:)
  • 哦抱歉我忘了 :)...我现在这样做了
猜你喜欢
  • 2018-01-23
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多