2016-07-27 10 views
0

私は、サーバーとクライアントを使ってプログラムを作りたがっています(はい、それでも同じです)。 クライアントは、コマンドを使用してサーバーに要求を送信します。 コマンドに応じて、サーバーは応答を送信します。Pythonソケットは常に同じです

不幸にも、コマンドに関係なく、クライアントが送信すると、サーバは常に同じ応答を返します。なぜですか?

import socket 
import errno 
import pickle 

def Main(): 
    host = '192.168.178.151' 
    port = 12345 


    all_text = ['text1', 'text2', 'text3'] 
    music_text = ['Konzert1', 'Konzert2', 'Konzert3'] 

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

    all_images = ['http://192.168.178.151/unlock.png', 'http://192.168.178.151/unlock.png', 'http://192.168.178.151/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) 

     try: 
      pcommand = c.recv(2048) 
     except IOError as e: 
      if e.errno == errno.EWOULDBLOCK: 
       pass 

     command = pickle.loads(pcommand) 

     print command[0] 
     if command[0] == 'GIVEALL': 

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

     elif command[0] == 'GIVEMUSIC': 
      textstring = pickle.dumps([music_text, all_images, all_description])#verwandelt Liste in String 
      c.send(textstring) 

     elif command[0] == 'ADD': 

      caption = command[1] 
      image = command[2] 
      describtion = command[3] 
      city = command[4] 


     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() 

そして、ここでは、クライアントである:ここで

がサーバである、

import socket 
import pickle 

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

class Netclient(object): 

    def __init__(self): 
     self.texte = [] 
     self.city = 'Pawonkuw' 
     self.ip = '192.168.178.151' 
     self.port = 12345 

    def giveWid(self, current='All'): 

     if current == 'All': 
      self.texte, self.images, self.description = self.sentHOT(self.ip, self.port) 
     elif current == 'Music': 
      self.texte, self.images, self.description = self.sentMusic(self.ip, self.port) 

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

    def sentHOT(self, host, port): 

     self.s = socket.socket() 

     self.s.connect((host, port)) 
     command = ['GIVEALL', self.city] 
     pcommand = pickle.dumps(command) 
     self.s.send(pcommand)#sends command 

     recived_string = self.s.recv(1023) 

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

     self.s.close() 

     return more_text[0], more_text[1], more_text[2] 

    def sentMusic(self, host, port): 
     self.s = socket.socket() 

     self.s.connect((host, port)) 
     command = ['GIVEMUSIC', self.city] 
     pcommand = pickle.dumps(command) 
     self.s.send(pcommand)#sends command 

     recived_string = self.s.recv(1023) 

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

     self.s.close() 

     self.images = ['unlock.png', 'unlock.png', 'unlock.png'] 

     return more_text[0], more_text[1], more_text[2] 

    def add_event(self, caption, image, description, city='Pawonkow'): 
     #print 'Add event executed' 
     self.s = socket.socket() 

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

     new_event = ['ADD', caption, image, description, self.city] 
     new_compact_event = pickle.dumps(new_event) 
     self.s.send(new_compact_event) 


     self.s.close() 


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

あなたは少し、この例を減らしてみてください助けてください。実際の問題をより簡単に見ることができます。 – cwallenpoole

+0

サーバーからの応答は何ですか? – user2853437

+0

'print command [0]'はサーバに出力するときと何を評価しますか? – RandomHash

答えて

0

サーバーにコードがc.recv()が失敗したという可能性を処理する必要があり

while True: 
    try: 
     pcommand = c.recv(2048) 
    except IOError as e: 
     if e.errno == errno.EWOULDBLOCK or e.errno == errno.EAGAIN: 
      continue 
     else: 
      pass # raise an error/handle in some other way 
    break 
0

私が見つかりました。この問題のための解決策、それは多くのインターネットボリュームに使用するため、私はそれを好きではない。 問題はtry ... except節でエラーが引き渡されましたが、エラーが発生した場合はハンドリングされて何も起こらなかったので、pcommandは同じままです。 私は接続が動作するまで接続しようとする再帰的なfunktionを作った。

誰もリソースを節約するソリューションを知っていますか?

def get_com(c): 
    try: 
     pcommand = c.recv(2048) 
     print pcommand 
    except IOError as e: 
     if e.errno == errno.EWOULDBLOCK or e.errno == errno.EAGAIN: 
      print 'error: rev doesnt work' 
      pcommand = get_com(c) 
    return pcommand 

.....

pcommand = get_com(c) 

command = pickle.loads(pcommand) 
関連する問題