2016-04-09 24 views
0

İki ana bilgisayar arasında bir komut istemi sohbet kurmaya çalışıyorum. Yazmayı ve yazdırmayı aynı anda etkinleştirmek için threading kullanıyorum. Bir PC aşağıdaki kodla sunucusu olarak ayarlanmış:sunucu-istemci sohbet python kullanarak iş parçacığı ile

def recvfun(): 
    for i in range(5): 
     print c.recv(1024) 
    return 

def sendfun(): 
    for i in range(5): 
     c.send(raw_input()) 
    return 

s = socket.socket()   # Create a socket object 
host = socket.gethostname() # Get local machine name 
port = 12345    # Reserve a port for your service. 
s.bind((host, port))  # Bind to the port 
s.listen(5)     # Now wait for client connection. 
c, addr = s.accept()  # Establish connection with client. 
print 'Got connection from', addr 

try: 
    Thread(target = recvfun, args = []).start() 
    Thread(target = sendfun, args = []).start() 
except Exception,errtxt: 
    print errtxt 

c.close()     # Close the connection 

Ve diğer PC aşağıdaki benzer kodla kurulur:

s = socket.socket()   # Create a socket object 
host = socket.gethostname() # Get local machine name 
port = 12345    # Reserve a port for your service. 
host = "192.168.1.111" 
s.connect((host, port)) 

try: 
    Thread(target = recvfun, args = []).start() 
    Thread(target = sendfun, args = []).start() 
except Exception,errtxt: 
    print errtxt 

s.close      # Close the socket when done 

Şu anda istemci hem de sunucu koşuyorum Aynı makinede, iki komut istemi ile. Gönderemiyor veya metinleri almaya çalışın Ama ne zaman, ben sunucu komut istemine üzerinde aşağıdaki hata günlüklerini alıyorum:

Got connection from ('192.168.1.111', 25789) 
hi 
Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner 
    self.run() 
    File "C:\Python27\lib\threading.py", line 763, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "C:\Python27\programs\server.py", line 12, in sendfun 
    c.send(raw_input()) 
    File "C:\Python27\lib\socket.py", line 170, in _dummy 
    raise error(EBADF, 'Bad file descriptor') 
error: [Errno 9] Bad file descriptor 

Aranızda bana bu hatayı alıyorum anlamak yardım eder misiniz ve nasıl çözülebilir .

Okuduğunuz için teşekkür ederiz!

cevap

1

Konular, kod yazmanız için sizi başlatır ve beklerken, ana programlar çalışmaya devam eder ve hemen soketi veya bağlantıyı kapatır, bu da veri göndermesi ve hataya neden olması için kullanılamaz hale getirir. Herhangi bir şeyi kapatmadan önce iş parçacığının bitmesini beklemek zorundasınız. Bunu sadece close çağrılarını kaldırarak gösterebilirsiniz.

+0

Teşekkür ederim! Şimdi çalışıyor. Programın iş parçacığının bitmesini bekleyip nasıl kapatacağını nasıl öğrenebilirim? – akhilc

+0

Google "python iş parçacığının bitmesini bekleyin" –