2016-06-29 13 views
2

私は基本的なチャットプログラムをプログラミングしています。これの目標は、まずserver.pyスクリプトを起動して、バックグラウンドで実行しておくことです。次に、ユーザーがclient.pyスクリプトを起動し、名前を選択してからメッセージを入力して送信します。問題は、送信しようとすると、このエラーが返されます。Pythonエラー:暗黙的にバイトを文字列に変換できません

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スクリプトは、client.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() 

---だ----

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

だから、どのように任意のアイデアを持っている場合この問題を解決するには、受信側のスレッドが常に実行されるようにしてチャットを積極的に更新する方法がありますか?

答えて

0

問題は、この行である:

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

あなたはbytesmessageを変換しているが、その後、あなたはbytesオブジェクトに変換されていない文字列を追加しています。 bytesを明白に文字列に変換できないため、エラーメッセージが示すとおり、これは無効な操作です。全体をエンコードしてみてください:

s.sendto((alias + ': ' + message).encode() , server) 
関連する問題