2016-07-10 2 views
4

저는 파이썬으로 서버와 클라이언트를 만들고 싶었습니다. 서버가 클라이언트에게 무언가를 보내는 곳과 클라이언트가 서버에 무언가를 보내는 곳이 하나 인 여러 연결을해야했습니다.python socket.error : [Errno 9] 잘못된 파일 설명자

첫 번째 연결이 잘 작동하지만, 두 번째는 메시지와 함께 추락 : 서버 여기

socket.error: [Errno 9] Bad file descriptor 

입니다 :

import socket 
import errno 
import pickle 

def Main(): 
    host = '188.174.233.99' 
    port = 66666 

    all_text = ['text1', 'text2', 'text3'] 

    all_description = ['Test \n Description1\n', 'Test \n Description1\n', 'Test \n Description1\n'] 

    all_images = ['unlock.png', 'unlock.png', 'unlock.png'] 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) 
    s.bind((host, port)) 
    s.listen(1) 


    while True: 

     c, addr = s.accept() 
     c.setblocking(0) 

     print "Connection from: " + str(addr) 


     command = c.recv(1024) 

     if command == 'GIVEALL': 
      textstring = pickle.dumps([all_text, all_images, all_description])#verwandelt Liste in String 
      c.send(textstring) 



     else: 
      try: 
       new_event = pickle.loads(command) 
       print new_event 
       caption = new_event[0] 
       image = new_event[1] 
       describtion = new_event[2] 
       city = new_event[3] 

      except: 
       pass 

     try: 
      c.close() 

      s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
     except socket.error as e: 
      if e.errno != errno.ECONNRESET: 
       raise 
      pass 

if __name__ == '__main__': 
    Main() 

그리고 여기에 클라이언트입니다 :

수입 소켓 가져 오기 피클

from kivy.properties import StringProperty 
from kivy.properties import NumericProperty 
from kivy.properties import ListProperty 

class Netclient(object): 

    def __init__(self): 
     self.s = socket.socket() 
     self.texte = [] 
     self.current = 'All' 

     self.ip = '188.174.233.99' 
     self.port = 66666 

    def giveWid(self): 
     print 'give Widgets executed' 
     if self.current == 'All': 
      self.texte, self.images, self.description = self.sentHOT(self.ip, self.port) 

     return self.texte, self.images, self.description 

    def sentHOT(self, host, port): 

     self.s.connect((host, port)) 
     self.s.send('GIVEALL')#sends command 

     recived_string = self.s.recv(1023) 

     more_text = pickle.loads(recived_string)#verwandelt string in liste 

     self.s.close() 
     print 'closed' 
     return more_text[0], more_text[1], more_text[2] 


    def add_event(self, caption, image, description, city='Pawonkow'): 
     new_event = [caption, image, description, city] 
     new_compact_event = pickle.dumps(new_event) 

     self.s.connect((self.ip, self.port)) 
     self.s.send(new_compact_event) 

     self.s.close() 


    n = Netclient() 
    t, i, d = n.giveWid() 
    print t 
    n.add_event('new', 'new.png', 'ew event', 'Hanau') 
+0

서버가 연결을 닫을 수 없습니다! 모든 연결을 쓰레드에 넣는다. 서버 쪽에서 만 허용되는'close' 메소드 ... – dsgdfg

+0

클라이언트 연결을 거부하려면'close' 메소드를 사용할 수있다. – dsgdfg

답변

3

닫힌 소켓을 다시 연결하려고하는 이유입니다. 새 소켓을 만들거나 연결되어있는 한 이전 소켓을 재사용해야합니다.

def sentHOT(...): 라인에서 self.s.close()을 주석 처리하고 def add_event(...) 메소드에서 self.s.connect((self.ip, self.port)) 라인을 주석 처리해야합니다. 더구나, this tutorial을 보시면 소켓 프로그래밍에 도움이됩니다.

+2

잘자요. 먼저 문제를 이해하지 못했습니다. 나는 그가 동시에 2 명의 고객을 시작했다는 것을 의미한다고 생각했다. 내가 옳은 대답이 아니기 때문에 나는 내 지위를 삭제했다. – jobou

+0

두 함수 모두에 대해 새 소켓이 있으면 어떻게 생깁니 까? –

+0

@GilgameschvonUruk 좀 더 설명해 주시겠습니까? 함수가 호출 될 때마다 새 소켓을 만드는 것을 의미합니까? – purrogrammer

관련 문제