2016-10-31 11 views
1

私はちょうどUDPサーバーとクライアントをPythonでプログラミングし始めています。私はチュートリアルに続き、コマンドラインチャットサーバーを作成するための知識をいくつか追加しました。私のクライアントがサーバーにメッセージを送信すると、サーバーは実際のメッセージの前にb 'を付けて印刷します。私のクライアントは、彼のメッセージを前にb 'を持って彼に送り返します。クライアントでメッセージのデコードを試みましたが、送信しませんでした。私は、サーバーがそれを送り返すときにメッセージのデコードを試みましたが、決してクライアントに返信しません。これを取り除きたい私の理由は、私がプログラムのために望んでいた外観を崩壊させたからです。何か助けてくれてありがとう!以下は、まずサーバーとクライアントのコードです。私のコードの後に​​は、私が得た出力の一部を貼り付けて、私が何を話しているかを正確に見ることができます。 日10月30日夜6時23分22秒2016( '192.168.1.66'、61249):::b'jake>ジェイクサーバーがメッセージを受信する方法メッセージの印刷時に 'b'接頭辞を削除するにはどうすればよいですか?

#Server 

from socket import * 
import time 

address = input("IP Address: ") 
port = input("Port: ") 

clients = [] 

serversock = socket(AF_INET, SOCK_DGRAM) 
serversock.bind((address, int(port))) 
serversock.setblocking(0) 

quitting = False 
print("Server is up and running so far.") 

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

#Client 

from socket import * 
import threading 
import time 

tLock = threading.Lock() 
shutdown = False 

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

address = input("IP Address: ") 
port = 0 

server = address, 6090 

clientsock = socket(AF_INET, SOCK_DGRAM) 
clientsock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
clientsock.bind((address, int(port))) 
clientsock.setblocking(0) 

rT = threading.Thread(target=receiving, args=("RecvThread", clientsock)) 
rT.start() 

nick = input("How about we get you a nickname: ") 
message = input(nick + "> ").encode() 
while message != "q": 
    if message != "": 
     clientsock.sendto(nick.encode() + "> ".encode() + message, server) 
    tLock.acquire() 
    message = input(nick + "> ").encode() 
    tLock.release() 
    time.sleep(0.2) 

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

+3

印刷時にデコードしようとしましたか? – wwii

+0

はい、私はしましたが、何らかの理由で印刷しませんでした。多分私はそれをやっている間に間違いを犯した、私は別のものを与えるだろう。あなたの提案のためのThabks! –

答えて

4

送受信するデータはバイト配列なので、デコードしてb''の文字列を取得する必要があります。
正しい出力を得るには、print(data.decode())を使用してください。エンコーディングを指定しない場合、デフォルトの動作はutf8を使用することです(詳細についてはpython docを参照してください)

+0

ありがとうございました!私はデータだけでなく全体全体をデコードしようとしましたが、それは間違っていました。 –

関連する問題