2017-03-14 3 views
1

Ich bin neu in Socket-Programmierung und versuchen, wieder in Python zu bekommen. Ich wollte ein einfaches TCP-Programm schreiben, das kontinuierlich eine Verbindung aufrechterhält, bis ein Endzustand erreicht ist, in diesem Fall wird "Schließen" vom Client gesendet.Python kontinuierliche TCP-Verbindung

Dies funktioniert gut für die erste Iteration, aber es friert auf der zweiten Sache, die ich sende, und ich bin mir nicht sicher, warum. Könnte jemand bitte erklären, warum mein Programm einfriert oder wie dies besser umgesetzt wird?

TCPServer.py

from socket import * 
serverPort = 12000 
serverSocket = socket(AF_INET, SOCK_STREAM) 
serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
serverSocket.bind(('', serverPort)) 
serverSocket.listen(1) 
print('The server is ready to recieve') 

while True: 
    connectionSocket, addr = serverSocket.accept() 
    sentence = connectionSocket.recv(1024).decode() 
    if(sentence == "close"): 
     connectionSocket.close() 
    capSentence = sentence.upper() 
    connectionSocket.send(capSentence.encode()) 

TCPClient.py

from socket import * 
serverName = 'localhost' 
serverPort = 12000 
clientSocket = socket(AF_INET, SOCK_STREAM) 
clientSocket.connect((serverName, serverPort)) 
while(1): 
    sentence = raw_input('input sentence: ') 
    if(sentence == "close"): 
     break 
    clientSocket.send(sentence.encode()) 
    retSentence = clientSocket.recv(1024) 
    print('From server; ', retSentence.decode()) 

clientSocket.close() 

Antwort

1

Es gibt mehrere Probleme mit dem Server. Ich werde versuchen, darauf hinzuweisen, was ich sehe.

Es friert bei der zweiten Sache ein, die Sie senden, weil der Server nie versucht, ein zweites Mal vom Client-Socket zu lesen, wenn die empfangenen Daten ungleich "close" sind. Sie müssen eine weitere Schleife um dies zu erreichen, wie zum Beispiel:

while True: 
    connectionSocket, addr = serverSocket.accept() 

    while True: 
     sentence = connectionSocket.recv(1024).decode() 
     if sentence == "close": break 
     capSentence = sentence.upper() 
     connectionSocket.send(capSentence.encode()) 

    connectionSocket.close() 

Zusätzlich ist zu beachten, dass der Server durch die Schleifen läuft synchron, und so kann es nicht eine zweite Verbindung akzeptieren, bis die ersten geschlossen ist.

Schließlich fehlt Ihnen Fehlerbehandlungscode. Der gesamte Server wird abstürzen, wenn ein Client die Verbindung vorzeitig trennt.


Wenn Ihr Ziel ist der Server nur handhabt eine einzelne Verbindung zu haben und dann beenden, ist die einfachste Lösung, um den accept() Anruf außerhalb der Hauptschleife zu bewegen (sonst warten Sie eine neue Verbindung auf jede Iteration).

connectionSocket, addr = serverSocket.accept() 

# Destroy the server socket; we don't need it anymore since we are not 
# accepting any connections beyond this point. 
serverSocket.close() 

while True: 
    sentence = connectionSocket.recv(1024).decode() 
    if(sentence == "close"): 
     connectionSocket.close() 
     break 
    capSentence = sentence.upper() 
    connectionSocket.send(capSentence.encode()) 
+0

Ich habe die Änderung der Verbindungsschleife und das scheint einige der Probleme zu beheben Ich war in diesem speziellen Fall haben, aber würde ich brauche die Art und Weise zu ändern, die ich darüber werde, wenn ich mehrere Kunden gesucht sich asynchron mit dem Server verbinden? – user2860682

+0

@ user2860682 Ja, Sie sollten eine Ereignisschleife verwenden, wenn Sie mehrere Verbindungen gleichzeitig verarbeiten möchten. Etwas wie verdreht oder asynchron. – cdhowie

0

Sie haben nur eine einzige Socket-Verbindung geht in dem Client aber im Server-Code bekommen haben Sie den accept Anruf innerhalb der while-Schleife. Verschiebe es außerhalb der Schleife.

Es gibt mehr als diese, die zwar mit dem Code falsch ist, aber das hängt irgendwie ab, wo man von hier gehen wollen

Verwandte Themen