【问题标题】:UDP TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'UDP TypeError:+ 的不支持的操作数类型:“NoneType”和“str”
【发布时间】:2017-04-18 12:47:15
【问题描述】:

我完全是 python 和计算机网络的新手。在从事 Uni 项目时,我遇到了一个问题。我究竟做错了什么?任何帮助我都会非常感激。

这里是服务器端:

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

【问题讨论】:

    标签: python udp client-server


    【解决方案1】:

    有几个问题;主要是印刷。

    您有几个 print('some text') + str(data) 实例;这是行不通的,因为当print() 输出到屏幕(STDOUT)时它返回None,所以你实际上在做的是试图连接None + str(data)

    你需要的是print('some text' + str(data))。

    此外,服务器端存在问题,您将从客户端接收到的数据回显到客户端 - 它需要重新编码为字节数组(它以字节数组的形式出现,被转换为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'),然后您可以将数据用作字符串(它将是)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2018-12-06
    • 1970-01-01
    相关资源
    最近更新 更多