2016-03-24 10 views
0

コードの目的は、ポイントツーポイント接続を使用することです。 1つのクライアントは接続をホストし、もう1つは接続するだけで、自由に行き来することができます。私は自分でコードを書こうとしていますが、私はソケットプログラミングとスレッディングについては新しいです。私は本当に私のためのネットワーキングのすべてをやっているライブラリをまだ使用したくはありません。正しい方向に私を押し込むためのアイデアはありますか?同じポート上で2つのスレッドを通信できますか?私は入力を感謝します。Python P2Pメッセージ

これをテストするには、2つのインスタンスを実行する必要があります。最初の端末は入力を受け取り(サーバーの場合は「S」を選択し、2番目の場合はクライアント側として動作するように何も入力しません)。私はこのコードを私が作業しているより大きいプログラムに組み込むためにテストしているので、完成した製品はユーザーフレンドリーになります!

私は次のエラーに実行している:ここで

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 763, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "test.py", line 11, in recvthread 
    data = client.recv(size) 
    File "/usr/lib/python2.7/socket.py", line 174, in _dummy 
    raise error(EBADF, 'Bad file descriptor') 
error: [Errno 9] Bad file descriptor 

は、スレッドを組み込むしようとしているコードです:

import socket 
import threading 
from threading import Thread 
import select 
import sys 

def recvthread(mssg): 
    print mssg 
    if (mssg == 1): 
     while True: 
      data = client.recv(size) 
      print "[Other]:" + data 
    if (mssg == 2): 
     while True: 
      data = s.recv(size) 
      print "[Other]:" + data 

def sendthread(mssg): 
    print mssg 
    if (mssg == 1): 
     while True: 
      data = raw_input("[ME]>") 
      client.send(data) 
    if (mssg == 2): 
     while True: 
      data = raw_input("[ME]>") 
      s.send(data) 

host = 'localhost' 
port = 2000 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
x = raw_input() 
test = 'S' 
if (x == test): 
    s.bind((host, port)) 
    s.listen(5) 
    client, address = s.accept() 
    t1 = Thread(target=recvthread, args=(1,)) 
    t2 = Thread(target=sendthread, args=(1,)) 
    t1.start() 
    t2.start() 
    client.close() 
else: 
    s.connect((host, port)) 
    t1 = Thread(target=recvthread, args=(2,)) 
    t2 = Thread(target=sendthread, args=(2,)) 
    t1.start() 
    t2.start() 
s.close() 
+0

スレッドを開始した直後に 'client.close()'?それは何が起こる可能性がありますか? –

+0

コードのその部分に移動する前にスレッドが終了するまで、または単に移動するまで待ちませんか?スレッドのリストを作成し、t.join()を使用してそれらが終了するのを待つ必要がありますか? – AricC

+0

正確に。あなたのスレッドは今のように終わることはありません。 –

答えて

0

問題は完全にスレッドを理解していない私でした。コードがスレッドの待機を待つようにしたい場合は、join()を使用する必要がありました。ルーキーミス...助けてくれてありがとう!

関連する問題