Wysyłanie danych po zamknięciu klienta.

0

mam taki kod (fragment kodu serwera):

def recv_data(self, client, addr):
        running = True
        while running:
            try:
                data = client.recv(1024)
                print 'Data from %s: %s' % (self.users[addr[1]], data)
            except socket.error:
                print 'User %s disconnected' % self.users[addr[1]]
                running = False
                client.close()
        client.close()

I wszystko odbiera dobrze, niestety gdy zamknę klienta, ten kod nadal odbiera "dane", które już teoretycznie nie powinny istnieć, a mianowicie wyświetla się w nieskończonej pętli :
Data from user1: (po dwukropku pusto)

Jak temu zapobiec ?

0

Napis "User user1 disconnected" się pojawia?

0

niestety nie, spamuje mi tylko w nieskończonej pętli o "Data from user1:"
Dziwne, gdyż na Windowsie mam podobne rozwiązanie i wszystko działa, a na ubuntu niet.

0

Tzn. wyjątek socket.error się nie pojawia. Spróbuj wychodzić z pętli również wtedy gdy client.recv() zwróci pusty string.

0

dodałem linijkę:

if not data or data == "": break

pod: data = recv... cóż to rozwiązanie nie jest złe, nie spamuje mi już faktycznie, ale dlaczego nie wyłapuje socket.error, skoro nie ma już połączenia między klient-serwer ?
Kod serwera:

import socket, threading


class Server(object):
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.threads = []
        self.clients = []
        self.users = {}
        self.server = None
    def init_socket(self):
        try:
            self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server.bind((self.host, self.port))
            self.server.listen(5)
            print 'Server startup(OK)!'
        except socket.error, msg:
            print "Cannot initialize socket:", msg
            self.server.close()
            return False
        return True
    
    def recv_data(self, client, addr):
        running = True
        while running:
            try:
                data = client.recv(1024)
                if not data or data == "": break
                print 'Data from %s: %s' % (self.users[addr[1]], data)
            except socket.error:
                print 'User %s disconnected' % self.users[addr[1]]
                running = False
                client.close()
        client.close()
            

    def turn_on(self):
        running = True
        user_count = 0
        if not self.init_socket():
            return False
        while running:
            client, addr = self.server.accept()
            if client not in self.threads:
                self.clients.append(client)
                user_count += 1
                self.users[addr[1]] = "user" + str(user_count)
                print 'Connected with %s' % self.users[addr[1]]
                self.threads.append(threading.Thread(target = self.recv_data, args = (client, addr)))
                self.threads[user_count-1].start()
        self.server.close()


if __name__ == "__main__":
    theServer = Server("localhost", 12548)
    theServer.turn_on()                  

1 użytkowników online, w tym zalogowanych: 0, gości: 1