2017-05-17 10 views
0

私はクライアントベースのチャットプログラムにシンプルなサーバーを作成しようとしていますが、問題はc.sendto(data,client)を実行しようとするとClientがintポート番号とアドレスを含むタプルです。私はタプルをバイトに変換してクライアントにメッセージを送ることができますか?Python:TypeError:str、bytesまたはbytearrayが予期せぬintではない

サーバースクリプト

import socket 

clients = [] 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("127.0.0.1",7999)) 
s.listen() 
print("Waiting for connection") 
c, addr = s.accept() 


while True: 
    data , addr = c.recvfrom(1024) 
    print(data) 
    if addr not in clients: 
     clients.append(addr) 
     print(clients[0]) 
    if data: 
     for client in clients: 
      print(client) 
      c.sendto(data,client) 
s.close() 

クライアントスクリプト

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
addr = ("127.0.0.1",7999) 
s.connect(addr)  
while True: 
    string = input(">>") 
    s.send(string.encode("utf-8")) 
    data =s.recv(1024) 
s.close() 

Server Output

+0

エラーを発生させる前にサーバが2つのクライアントを表示しているようです。つまり、最終的なforループが何も問題なく実行された場合、クラッシュすることがありますか? – Trolldejo

+0

'client [0] = str(client [0])'を設定するとどうなるでしょうか? – Trolldejo

+0

@Trolldejoいいえ、それは同じサイクルで2回しか印刷されません。今は自分のコードを編集できませんが、あなたが示唆したように行います。 – Kozero

答えて

0

問題は、接続モードのソケットにはsendto()を使用しているということです。代わりにc.send(data)が必要だと思います。

詳細:

のsendtoためのPythonドキュメントが言う「宛先ソケットがアドレスによって指定されているのでソケットは、リモートソケットに接続しないでください。」また、sendtoのマニュアルページでは、「接続モード(SOCK_STREAM、SOCK_SEQPACKET)ソケットでsendto()が使用されていると、dest_addrとaddrlen引数は無視されます(NULLでない場合はエラーEISCONNが返されます)。 "私はこれが起こっていると思っていますが、Pythonはエラーを混乱させて誤って報告しています。

一般に、ソケットインターフェイスとネットワークはかなり混乱するかもしれませんが、基本的にsendto()はUDP/IPタイプのインターネットトラフィックであるSOCK_DGRAM用に予約されています。これはレターやポストカードを受信者に送信すると考えることができます。それぞれには受取人の住所が記載されており、領収書の発注は保証されません。一方、SOCK_STREAMのような接続モードソケットは、あなたが一定の期間接続を確立するという点で、もう少し電話に似ているTCP/IPを使用しています。

あなたのコードは接続を介して通信するように設計されているようだから、sendtoではなくc.send(data)をほしいと思うと思います。

+0

しかし、この場合、データを他のクライアントに返すことはできません。 – Kozero

+0

nvm私はSOCK_DGRAMに切り替えました。 – Kozero

関連する問題