Python套接字始终如此

时间:2016-07-27 13:13:26

标签: python sockets

我想用服务器和客户端制作一个程序(是的,仍然是相同的)。 客户端使用命令向服务器发送请求。 根据命令,服务器发送响应。

不幸的是,无论命令如何,客户端发送,服务器总是给出相同的响应,为什么?

这是服务器:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我找到了这个问题的解决方案,但我不喜欢它,因为它使用了很多互联网量。 问题是错误是由try ... except子句进行的,但是如果发生了错误,那么它就是handeled并且没有发生任何事情,所以pcommand保持不变。 所以我做了一个递归的功能,尝试连接直到连接工作。

有人知道使用更少资源的解决方案???? 请帮忙

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)