
OS: Windows XP och Python 2.7.6 även denna gång.
Jag använder "socket" för att skapa en anslutning mellan en server och en klient.
Kring detta funderar jag på två saker, men jag tar en sak i taget:
Om klienten plötsligt avbryter anslutningen. T.ex om programmet kraschar
eller om CTRL+C abrupt bara avslutar programmet utan att stänga innan.
Hur hanterar man detta snyggt i servern?
Koden för att ta emot data ser ut såhär:
Kod: Markera allt
try:
data = clientsocket.recv(1024)
data = data.decode('iso8859-1')
data_ren = data.rstrip() #Tar bort alla former av 'newline' och 'whitespace'
except KeyboardInterrupt:
osv..
Det har inget med detta problem att göra.)
Och så här ser det ut hos servern när jag avbryter klient-scriptet med CTRL+BREAK :
Unhandled exception in thread started by <function handler at 0x00BAC9B0>
Traceback (most recent call last):
File "server2.py", line 23, in handler
data = clientsocket.recv(1024)
socket.error: [Errno 10054] En befintlig anslutning tvingades att stõnga av fjärrvärddatorn
Jag tolkade det som att exception-typen är "socket.error" och justerade exception-raden såhär:
Kod: Markera allt
try:
data = clientsocket.recv(1024)
data = data.decode('iso8859-1')
data_ren = data.rstrip() #Tar bort alla former av 'newline' och 'whitespace'
except clientsocket.error:
osv..
Men då ser det ut så här hos servern när jag avbryter klient-scriptet med CTRL+BREAK :
"Unhandled exception in thread started by <function handler at 0x00BAC9B0>
Traceback (most recent call last):
File "server2.py", line 26, in handler
except clientsocket.error:
AttributeError: '_socketobject' object has no attribute 'error'"
Jag har letat efter andra lösningar och funnit bl.a:
except socket.error, (value,message):
Länk
Men det gav samma fel.
Jag vill främst alltså "läsa av" ifall anslutningen brutits av t.ex klienten.
(Och som steg två även ta hand om CTRL+C hos servern.
Det vore smidigt om det gick att få med i samma exception.)
-----
Som parentes kan jag nämna fråga nr 2 också:
Naturligtvis vill man ju inte behöva stänga anslutningen med CTRL+C eller liknande.
Man vill ju ha ett val för "stäng anslutning".

Så hur stänger man anslutningen snyggt?