我已经创建了一个TCP多线程网络服务器,但它给了我以下内容 如果找到该文件 它说“int obj没有属性编码” 2.稍后,它将显示列表索引超出范围
如果找不到该文件 1.它不会在Web浏览器上显示html错误消息 2.稍后,它将显示列表索引超出范围
我的服务器代码是
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)
答案 0 :(得分:0)
您已在代码中以二进制文件的形式打开文件:
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消息也是如此。