コードの目的は、ポイントツーポイント接続を使用することです。 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()
スレッドを開始した直後に 'client.close()'?それは何が起こる可能性がありますか? –
コードのその部分に移動する前にスレッドが終了するまで、または単に移動するまで待ちませんか?スレッドのリストを作成し、t.join()を使用してそれらが終了するのを待つ必要がありますか? – AricC
正確に。あなたのスレッドは今のように終わることはありません。 –