2017-01-21 3 views
0

サーバー側UDPソケット - 複数のクライアントが実行されている範囲外のリスト

def address(x): 
radd=(1,1) 
f=open("name.list","rb") 
for list in f: 
    list=list.split() 
    if(list[0]==x): 
     radd=(list[1],list[2]) 
     break 
return radd 
f.close() 

while True: 
    data=recvfrom(1024) 
    elif (data[0] == "send"): 
    f=open("name.list","rb") 
    add=address(data[1]) 
    radd=add[0] + " " + add[1] 
    for list in f: 
     name=list.split() 
     if(int(addr[1])==int(name[2])): 
      s.sendto(str(radd),addr) 
      break 
    else: 
     s.sendto("not logged in ",addr) 
    f.close() 

クライアント側

input="send usrname message" 
s.sendto(input,server) 
while True: 
    if (input[0]=="send"): 
     radd,add=s.recvfrom(1024) 
     print radd 
     radd=radd.split() 
     print radd 
     ip=radd[0] 
     print ip 
     port=int(radd[1]) 
     print port 
     radd=(ip,port) 
     s.sendto(input[2],radd) 
     continue 

形式 名前でファイルストアは、ポート

が上正常に動作しますIPアドレス最初のクライアントですが、2番目のクライアントを開いて最初のクライアントにメッセージを送信しようとすると、このエラーがスローされます。最初のクライアントは2番目のクライアントに複数のメッセージを送信できます。私はクライアント接続を呼び出すために同じclient.pyファイルを使用しました。

Traceback (most recent call last): File "client.py", line 30, in port=int(radd[1]) IndexError: list index out of range

私はそれぞれのデータ変換後にprint文を追加しました。私はソケットsend関数を省略すると、それは完全に正常に動作しますが、sendto関数を使用すると、エラーが発生し、printが期待した結果を出力しません。

+0

最初のソケットから予想されるアドレスの形式は何ですか? "ip:port"という形式の場合は、.split()の代わりに.split( ":")を使用してください。 – Saulpila

+0

str(ip port) –

+0

あなたは印刷ステートメントの出力を投稿しますか?そしてメモとして、実行するために 'f.close()'は 'return radd'の前に行かなければなりません(サーバスクリプトの終わりで)。 – Saulpila

答えて

0
port=int(radd[1]) IndexError: list index out of range 

このエラーは、基本的にuがリストに第一の要素にアクセスしているが、この第一の位置にある要素がないことを意味します。 raddリストに含まれる要素は1つだけです。これをチェックし、プログラムコードを修正してください。

関連する問題