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)然后应该工作。此外,请参阅本教程,它将帮助您使用套接字编程。