2012-04-12 23 views
2

Ich möchte eine While-Schleife implementieren, die so lange läuft, wie ein Client an meinem Socket angeschlossen ist. Es wird Thread-basiert sein, also möchte ich sicherstellen, dass der Thread geschlossen wird, sobald der Client die Verbindung getrennt hat.Überprüfen, ob der Socket-Client noch verbunden ist

  1. Frage: Wie überprüfe ich, ob der Client noch mit meinem Socket verbunden ist?

  2. Frage: Wird der Thread beim Schließen der Verbindung bereits geschlossen, wenn ich folgendes starte: Thread.start (socket.accept) do | client | ...

+0

Sendet Ihnen der Client Daten über den Socket? Wenn ja, ruf einfach "recv" am Socket an. "recv" gibt einen Fehler zurück, wenn der Socket geschlossen ist. Alternativ können Sie mit "Select" oder "Poll" den Status des Sockets überprüfen. Bitte überprüfen Sie die entsprechenden Anrufe in Ruby. – Raam

+0

leider im moment es nur "puts" ende "bekommt" funktioniert die "recv" -Methode immer noch als? –

Antwort

0

Ich habe keine Erfahrung Programmierung Ruby. Wenn es .Net war, ist das, was Sie vorgeben, nicht möglich ohne eine Art Keep-Alive-Protokoll. Wenn der Server nach x Sekunden keine Daten vom Client erhält, nimmt er an, dass der Client nicht verbunden ist. Der Client muss einen Timer haben, um etwas an den Server zu senden, wenn er nicht kommuniziert.

+0

Ich habe darüber nachgedacht. Aber es wäre schöner, wenn es einen einfacheren Weg gibt :) Nun, ich denke, ich muss es tun, wenn es keinen anderen Weg gibt. –

+0

Was ist, wenn Timeout nicht die Möglichkeit ist zu wissen, ob ein Socket in der Nähe ist oder nicht? – Israel

+0

@Israel Ich weiß nicht, was das bedeutet. Warum sollte eine Auszeit nicht der richtige Weg sein? – EJP

2

Check this out,

require 'socket'     
th=[] 
server = TCPServer.open(2000) 

loop do 
    Thread.start(server.accept) do |client| 
    client.puts "server started.." 

    # Something 

    th = Thread.list 
    th.each do |t| 
     if t.status == "sleep" # checks all client status 
     f = t.kill   # kills thread if client is disconnected 
     end 
    end 
    end 
end 

können Sie den Thread töten oder Sie können den IP addres von Clients speichern, dass Thread in einem Array und eine exakte Client mit dem vergleichen, machen. (Wie t. adr)

+2

Aber woher wissen Sie, ob der Client * verbunden ist? Beantwortet die Frage nicht. – EJP

0
server = TCPServer.open 12345 

loop { 
    Thread.start(server.accept) do |client| 
    ... 
    puts "client is offline!" if client.closed? 
    ... 
    client.close 
    end 
} 

Sie können überprüfen "geschlossen?" in "Kunde".

Verwandte Themen