【问题标题】:Python error: Can't convert bytes to string implicitlyPython 错误:无法将字节隐式转换为字符串
【发布时间】:2016-11-01 18:05:11
【问题描述】:

我正在编写一个基本的聊天程序。这样做的目的是首先通过启动 server.py 脚本来设置服务器,然后让它在后台运行。然后用户启动 client.py 脚本并选择一个名称,然后开始键入消息并发送它。问题是当我尝试发送它时,它会返回此错误。

Traceback (most recent call last):
  File "C:\Users\Hello\AppData\Local\Programs\Python\Python35-32\client.py", line 38, in <module>
    s.sendto(alias + ': ' + message.encode() , server)
TypeError: Can't convert 'bytes' object to str implicitly

这是 server.py 脚本 ---

import socket
import time

host = '127.0.0.1'
port = 47015

clients = []
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
s.setblocking(0)

qutting = False
print("Server Started")

while not qutting:
    try:
        data, addr = s.recvfrom(1024)
        if 'Quit' in str(data):
            qutting = True
        if addr not in clients:
            clients.append(addr)
        print(time.ctime(time.time()) + str(addr) + ": :" + str(data))
        for client in clients:
            s.sendto(data, client)
    except:
        pass
s.close()

然后是client.py脚本----

import socket
import threading
import time


tLock = threading.Lock()
shutdown = False

def recieving(name, sock):
    while not shutdown:
        try:
            tLock.acquire()
            while True:
                data, addr = sock.recvfrom(1024)
                data.decode()
                print(str(data))
        except:
            pass
        finally:
            tLock.release()

host = '127.0.0.1'
port = 0

server = ("127.0.0.1", 47015)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
s.setblocking(0)

rT = threading.Thread(target=recieving, args=('RecvThread', s))
rT.start()

alias = input("Name: ")
message = input(alias + "->")
while message != 'q':
    if message != '':
        s.sendto(alias + ': ' + message.encode() , server)
    tLock.acquire()
    message = input(alias + '->')
    tLock.release()
    time.sleep(0.2)

shutdown = True
rT.join()
s.close()

因此,如果您知道如何解决此问题,我们将不胜感激还有一个附带问题是,是否有办法使接收线程始终运行,从而主动更新聊天?

【问题讨论】:

    标签: sockets python-3.x server


    【解决方案1】:

    问题出在这一行:

    s.sendto(alias + ': ' + message.encode() , server)
    

    您正在将message 转换为bytes,但随后您将未转换的字符串添加到bytes 对象。这是一个无效操作,因为错误消息告诉您,因为 bytes 不能明确地转换为字符串。尝试对整个内容进行编码:

    s.sendto((alias + ': ' + message).encode() , server)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      相关资源
      最近更新 更多