UDP TypeError:不支持的操作数类型为+:'NoneType'和'str'
问题描述:
我完全是Python和计算机网络的新手。在Uni项目上工作时,我遇到了一个问题。我究竟做错了什么?我非常感谢任何帮助。UDP TypeError:不支持的操作数类型为+:'NoneType'和'str'
下面是服务器端:
import socket
def Main():
host = "127.0.0.1"
port = 5000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
print ("Server Started.")
while True:
data, addr = s.recvfrom(1024)
print ("message from: ") + str(addr)
print ("from connected user: ") + str(data.decode('utf-8'))
data = str(data).upper()
print ("sending: ") + str(data)
s.sendto(data, addr)
s.close()
if __name__ == '__main__':
Main()
这里是我的客户端:
import socket
def Main():
host = "127.0.0.1"
port = 5000
server = ('127.0.0.1', 5000)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
message = input('->')
while message != 'q':
s.sendto(message.encode('utf-8'), server)
data, addr = s.recvfrom(1024)
print ('Received from server: ') + str(data)
message = input('->')
s.close()
if __name__ == '__main__' :
Main()
答
有一对夫妇的问题;主要是与印刷。
你有几个例子print('some text') + str(data)
;这是行不通的,因为虽然print()
输出到屏幕(标准输出),它返回None
,所以你实际上在做正试图拼接None + str(data)
你需要的是print('some text' + str(data))
。
此外,服务器端存在问题,您将从客户端接收的数据回显给客户端 - 需要将其重新编码为字节数组(它以bytearray形式进入,转换为一个用于显示的utf-8字符串,它在回复之前需要返回bytearray)。
总之,服务器:
import socket
def Main():
host = "127.0.0.1"
port = 5000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
print("Server Started.")
while True:
try:
data, addr = s.recvfrom(1024)
print("message from: " + str(addr)) # moved string concatenation inside print method
print("from connected user: " + str(data.decode('utf-8'))) # moved string concatenation inside print method
data = str(data).upper()
print("sending: " + str(data)) # moved string concatenation inside print method
s.sendto(data.encode('utf-8'), addr) # needed to re-encode data into bytearray before sending
except KeyboardInterrupt: # added for clean CTRL + C exiting
print('Quitting')
break
s.close()
if __name__ == '__main__':
Main()
而且客户端:
import socket
def Main():
host = "127.0.0.1"
port = 5001
server = ('127.0.0.1', 5000)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
message = input('->')
while message != 'q':
try:
s.sendto(message.encode('utf-8'), server)
data, addr = s.recvfrom(1024)
print('Received from server: ' + str(data)) # moved string concatenation inside print method
message = input('->')
except KeyboardInterrupt: # added for clean CTRL + C exiting
print('Quitting')
break
s.close()
if __name__ == '__main__':
Main()
谢谢爱德华这么多。这在客户端:print('Received from server:'+ str(data.decode('utf-8')))? –
良好的皮卡 - 是的,你需要在客户端。在收到数据后,根据需要转换数据可能更容易,那么每次使用它时都不必使用它。例如:'data = data.decode('utf-8')',那么你可以使用数据作为字符串(它会是)。 –