2016-03-24 2 views
0

Таким образом, цель этого кода заключается в том, чтобы иметь соединение точка-точка. Один клиент будет принимать соединение, а другой будет просто подключаться, и они должны иметь возможность свободно и свободно разговаривать. Я пытаюсь сам написать код, но я новичок в программировании сокетов и потоковом режиме. Я действительно не хочу использовать библиотеку, которая все время создает для меня сеть. Любые идеи, чтобы подтолкнуть меня в правильном направлении? Можно ли связать два потока на одном и том же порту? Я ценю вход.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() 
+0

'client.close()' сразу после запуска потоков? Что это может привести? –

+0

не дождался, пока потоки закончатся, прежде чем перейти к этой части кода или просто переместиться? поэтому я должен создать список потоков и использовать t.join(), чтобы дождаться их завершения? – AricC

+0

Точно. Ваши потоки никогда не заканчиваются, как сейчас. –

ответ

0

Этот вопрос мне не совсем понимая нарезание резьбы. Если бы я хотел, чтобы код дождался, пока потоки будут ждать, мне нужно будет использовать join(). Ошибка новичков ... Спасибо за помощь!