python - Basic Socket Chat Program Using Multithreading Raises Errors -


i making basic chat program using socket , multi threading. program connected , when message sent client raises error on server side when executed:

exception in thread thread-1: 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:\users\jclarke14\desktop\server - 2.py", line 25, in check_for_data     data = c.recv(1024)   file "c:\python27\lib\socket.py", line 174, in _dummy     raise error(ebadf, 'bad file descriptor') error: [errno 9] bad file descriptor 

i beginner , new multi-threading , socket. doing wrong?

here code client:

#check incoming data  def check_for_data():     while true:         data = s.recv(1024)         print "other: " + data         print  #send data  def send_data():     while true:         message = raw_input("you: ")         print         s.sendall(message)  #start threads  t = threading.thread(target=send_data) t.daemon = true t.start() #1  t = threading.thread(target=check_for_data) t.daemon = true t.start() #2 

and code server:

c, addr = s.accept()  print "connection from: " + str(addr) print  def check_for_data():     while true:         data = c.recv(1024)         print "other: " + str(data)         print  def send_data():     while true:         message = raw_input("you: ")         print         c.sendall(message)  #start threads  t = threading.thread(target=send_data) t.daemon = true t.start() #1  t = threading.thread(target=check_for_data) t.daemon = true t.start() #2 

the full code available here: https://drive.google.com/folderview?id=0b3t3muqs3k-ilwy3y3jzx2yzu2c&usp=sharing

thank :)

after starting thread code closes remote socket in both server , client code. need wait thread complete before closing it's socket.

so, server remove last line c.close(). can wait in main thread child thread using t.join(). after can close socket.

you change thread code terminates when remote client closes socket. , better pass socket thread have thread access global variable:

def check_for_data(c):     while true:         data = c.recv(1024)         if data:             print "other: " + str(data)         else:             print "client closed connection"             c.close()             break  t = threading.thread(target=check_for_data, args=(c,)) t.daemon = true t.start()  t.join() #c.close()    # if don't close in thread s.close()    # close main server socket 

Comments

Popular posts from this blog

java - Run spring boot application error: Cannot instantiate interface org.springframework.context.ApplicationListener -

reactjs - React router and this.props.children - how to pass state to this.props.children -

Excel VBA "Microsoft Windows Common Controls 6.0 (SP6)" Location Changes -