python的套接字。错误:[Errno 9]错误的文件描述符。

时间:2021-01-11 20:31:01

I wanted to make a server and a client with Python. It was supposed to make multiple connections, one, where the server is sending something to the client, and one where the client is sending something to the server.

我想用Python做一个服务器和一个客户端。它应该创建多个连接,其中一个是服务器向客户端发送一些东西,另一个是客户端向服务器发送一些东西。

The first connection worked fine, but the second one crashed with the message:

第一个连接运行良好,但是第二个连接崩溃了:

socket.error: [Errno 9] Bad file descriptor

Here is the Server:

这是服务器:

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

And here is the Client:

这是客户端:

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

1 个解决方案

#1


3  

The reason is that you are trying to reconnect a closed socket. You have to either create a new socket or reuse the old one as long as it's connected.

原因是您试图重新连接一个封闭的套接字。您必须创建一个新的套接字或重用旧的套接字,只要它是连接的。

In method def sentHOT(...): comment the line self.s.close() and in method def add_event(...) comment the line self.s.connect((self.ip, self.port)) then should work. Further, please take a look at this tutorial, it helps you with socket programming.

在方法def sentHOT(…):注释行self.s.close()和方法def add_event(…)注释行self。(ip, self。port)然后应该工作。此外,请参阅本教程,它将帮助您使用套接字编程。

#1


3  

The reason is that you are trying to reconnect a closed socket. You have to either create a new socket or reuse the old one as long as it's connected.

原因是您试图重新连接一个封闭的套接字。您必须创建一个新的套接字或重用旧的套接字,只要它是连接的。

In method def sentHOT(...): comment the line self.s.close() and in method def add_event(...) comment the line self.s.connect((self.ip, self.port)) then should work. Further, please take a look at this tutorial, it helps you with socket programming.

在方法def sentHOT(…):注释行self.s.close()和方法def add_event(…)注释行self。(ip, self。port)然后应该工作。此外,请参阅本教程,它将帮助您使用套接字编程。