Таким образом, цель этого кода заключается в том, чтобы иметь соединение точка-точка. Один клиент будет принимать соединение, а другой будет просто подключаться, и они должны иметь возможность свободно и свободно разговаривать. Я пытаюсь сам написать код, но я новичок в программировании сокетов и потоковом режиме. Я действительно не хочу использовать библиотеку, которая все время создает для меня сеть. Любые идеи, чтобы подтолкнуть меня в правильном направлении? Можно ли связать два потока на одном и том же порту? Я ценю вход.Python P2P messaging
Чтобы проверить это, вам нужно будет запустить два экземпляра, первый терминал примет вход (выберите «S» для сервера), а второй введите что-либо (или ничего), чтобы действовать как клиентская сторона. Я тестирую этот код, чтобы включить его в большую программу, над которой я работаю, поэтому готовый продукт будет более удобным для пользователя!
Я бегу на следующие ошибки:
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
Точно. Ваши потоки никогда не заканчиваются, как сейчас. –