WebSocked chat Browser kill

Irgendwelche Probleme mit XAMPP für Windows? Dann ist hier genau der richtige Ort um nachzufragen.

WebSocked chat Browser kill

Postby LawMower » 10. March 2018 04:40

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();
}
}
}
}
}
LawMower
 
Posts: 1
Joined: 10. March 2018 04:22
XAMPP version: 7.2.2
Operating System: Win10

Re: WebSocked chat Browser kill

Postby Nobbie » 10. March 2018 10:58

Gar nicht. Das ist das Problem von HTTP, ein sog. zustandsloses Protokoll. Genau das ist ein typisches Problem.
Nobbie
 
Posts: 13182
Joined: 09. March 2008 13:04


Return to XAMPP für Windows

Who is online

Users browsing this forum: No registered users and 27 guests