UDP TypeError:不支持的操作数类型为+:'NoneType'和'str'

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() 
+1

谢谢爱德华这么多。这在客户端:print('Received from server:'+ str(data.decode('utf-8')))? –

+0

良好的皮卡 - 是的,你需要在客户端。在收到数据后,根据需要转换数据可能更容易,那么每次使用它时都不必使用它。例如:'data = data.decode('utf-8')',那么你可以使用数据作为字符串(它会是)。 –