Hallo,
ich habe einen kleinen "Chat Server" geschrieben.
Dieser verteilt eingehende Nachrichten an alle angeschossenen Browser.
Wenn ich einen Browser ordnungsgemäß schließe, wird die OnClose() Funktion ausgeführt.
Wenn der Browser aber abgeschossen wird, denkt das Programm, das der Browser noch geöffnet ist.
Wie kann ich erkennen, das Die Verbindung nicht mehr besteht?
package tool_cmd;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
//import javax.servlet.ServletContextEvent;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.PongMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/surf")
public class SurfLight
{
// Timer für Zustandsprüfung
final ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor();
private boolean bTimerStarted = false;
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
private static Set<Session> SurfClients = Collections.synchronizedSet(new HashSet<Session>());
@OnOpen
public void onOpen(Session session)
{
// Weiteren Browser addieren
SurfClients.add(session);
System.out.println("Open Connection " + SurfClients.size());
// start the scheduler on the very first connection
// to call sendTimeToAll every second
if (SurfClients.size()==1 & !bTimerStarted)
{
bTimerStarted = true;
System.out.println("Start Timer");
timer.scheduleAtFixedRate(() -> sendTimeToAll(session),0,1,TimeUnit.SECONDS);
}
}
@OnMessage
public String onMessage(Session session, String message)
{
System.out.println("Message from the client surf: " + message);
String echoMsg = "Echo from the server surf: " + message + ToolState.connectedNum;
sendMsgToAll(session, message);
return echoMsg;
}
@OnError
public void onError(Throwable e)
{
e.printStackTrace();
}
@OnClose
public void onClose (Session session)
{
// Remove session from the connected sessions set
SurfClients.remove(session);
}
// Timer
private void sendTimeToAll(Session session)
{
sendMsgToAll(session, LocalTime.now().format(timeFormatter));
System.out.println("Time " + LocalTime.now().format(timeFormatter));
}
private void sendMsgToAll(Session session, String message)
{
synchronized(SurfClients)
{
//System.out.println(SurfClients.size());
// Iterate over the connected sessions
// and broadcast the received message
for(Session client : SurfClients)
{
try
{
client.getBasicRemote().sendText(message);//.getBasicRemote().sendPing(arg0);.getSendStream().flush();
}
catch (IOException e)
{
System.out.println("error");
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}