Python socket.send() kann nur einmal senden, dann socket.error: [Errno 32] Broken pipe aufgetreten
Ich bin ein Neuling in Netzwerk-Programmierung, also bitte verzeihen Sie mir, wenn dies ist eine blöde Frage 🙂
Ich erstellte 1 client und 1 SocketServer.ThreadingMixIn server auf Ubuntu 10.04.2 mit Python2.7, aber
wie es scheint, kann ich nur Socke nennen.send() einmal im client, dann bekomme ich ein:
Traceback (most recent call last):
File "testClient1.py", line 33, in <module>
sock.send('c1:{0}'.format(n))
socket.error: [Errno 32] Broken pipe
Hier ist der code, den ich schrieb:
testClient1.py:
#! /usr/bin/python2.7
# -*- coding: UTF-8 -*-
import sys,socket,time,threading
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
sock.connect(('localhost',20000))
except socket.error:
print('connection error')
sys.exit(0)
n=0
while n<=1000:
sock.send('c1:{0}'.format(n))
result=sock.recv(1024)
print(result)
n+=1
time.sleep(1)
testServer.py:
#! /usr/bin/python2.7
# -*- coding: UTF-8 -*-
import threading,SocketServer,time
class requestHandler(SocketServer.StreamRequestHandler):
#currentUserLogin={} #{clientArr:accountName}
def handle(self):
requestForUpdate=self.rfile.read(4)
print(requestForUpdate)
self.wfile.write('server reply:{0}'.format(requestForUpdate))
class broadcastServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
if __name__ == '__main__':
server=broadcastServer(('localhost',20000),requestHandler)
t = threading.Thread(target=server.serve_forever)
t.daemon=True
t.start()
print('server start')
n=0
while n<=60:
print(n)
n+=1
time.sleep(1)
server.socket.close()
Ich lief Sie in 2 separaten Klemmen:
Ausgabe der 1. terminal:
$ python2.7 testServer.py
server start
0
1
2
3
4
c1:0
5
6
7
8
9
10
11
...
Ausgang des 2. terminal:
$ python2.7 testClient1.py
server reply:c1:0
Traceback (most recent call last):
File "testClient1.py", line 33, in <module>
sock.send('c1:{0}'.format(n))
socket.error: [Errno 32] Broken pipe
Ich habe versucht, den Aufruf Socke.send() zweimal direkt in testClient.py,
für ex:
while n<=1000:
sock.send('c1:{0}'.format(n))
sock.send('12333')
result=sock.recv(1024)
print(result)
n+=1
time.sleep(1)
aber die Ausgänge der terminals sind immer noch die gleichen 🙁
Kann bitte jemand erklären, was mache ich hier falsch?
Thx in adv!
Hier ist der [Sol] ich kam mit. Danke Mark:)
testClient1.py:
import sys,socket,time
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
sock.connect(('localhost',20000))
except socket.error:
print('connection error')
sys.exit(0)
n=0
while n<=10: #connect once
sock.send('c1:{0}'.format(n))
result=sock.recv(1024)
print(result)
n+=1
time.sleep(1)
sock.close()
#once you close a socket, you'll need to initialize it again to another socket obj if you want to retransmit
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
sock.connect(('localhost',20000))
except socket.error:
print('connection error')
sys.exit(0)
n=0
while n<=10: #connect once
sock.send('c3:{0}'.format(n))
result=sock.recv(1024)
print(result)
n+=1
time.sleep(1)
sock.close()
testServer.py:
import threading,SocketServer,time
class requestHandler(SocketServer.StreamRequestHandler):
#currentUserLogin={} #{clientArr:accountName}
def handle(self):
requestForUpdate=self.request.recv(1024)
print(self.client_address)
while requestForUpdate!='':
print(requestForUpdate)
self.wfile.write('server reply:{0}'.format(requestForUpdate))
requestForUpdate=self.request.recv(1024)
print('client disconnect')
class broadcastServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
if __name__ == '__main__':
server=broadcastServer(('localhost',20000),requestHandler)
t = threading.Thread(target=server.serve_forever)
t.daemon=True
t.start()
print('server start')
n=0
while n<=60:
print(n)
n+=1
time.sleep(1)
server.socket.close()
InformationsquelleAutor hencrice | 2011-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
handle() aufgerufen, in der
SocketServer.StreamRequestHandler
einmal für jede Verbindung. Wenn Sie Rückkehr vonhandle
wird die Verbindung geschlossen.Wenn du willst das der server mit mehr als einem senden/empfangen, müssen Sie eine Schleife, bis recv() 0 zurück, der angibt, die client hat die Verbindung geschlossen (oder zumindest namens shutdown() on sendet).
Beachten Sie auch, dass TCP ist ein streaming-Protokoll. Sie müssen das design eines message-Protokoll, das angibt, die Länge oder das Ende einer Nachricht und Puffer
recv
bis Sie eine vollständige Nachricht. Überprüfen Siesend
Rückgabewert, um sicherzustellen, dass alle die Nachricht gesendet wird, oder verwenden Siesendall
.danke, ich war auch mit demselben Problem. Ich Frage mich, warum dieses Zeug nicht in SocketServer Dokumentation. Wissen Sie, wo ich kann, finden Sie detaillierte doc auf der SocketServer.Tcpserver gestartet?
die
SocketServer.py
Datei ist sehr einfach. Es ist lehrreich zu Lesen, einfach der Quelle.InformationsquelleAutor Mark Tolonen