Hallo liebe Leute,
ich bin Anfänger in der Websocket-Technologie und komme bei meinem Echo-WebSocket-Programm nicht weiter.
Client und Server erben von Endpoint.
Mein Problem:
Client und Server bauen eine Verbindung auf. Im Client wird die Methode onOpen aufgerufen, aber im Server geschieht nichts. Er meldet überhaupt nichts. Auch gibt es keine Fehlermeldungen.
Mir ist klar, dass ich das über Annotationen machen kann z.B. @OnOpen, @OnMessage usw. aber möchte es speziell ohne Annotationen haben.
Soviel ich verstanden habe muss es auch ohne klappen, indem man von Endpoint erbt und die Methoden überschreibt.
hier noch mein Code:
HelloServer.java:
@ServerEndpoint(value="/echo")
public class HelloServer extends Endpoint{
//@OnOpen <<<<<<<<<<<<<<<<<< Wenn OnOpen Annotation verwendet wird klappt das mit dem Echo Programm und alles läuft wie gewollt
@Override
public void onOpen(final Session session, EndpointConfig config) {
System.out.println("in onOpen:::Server");
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException ex) {
Logger.getLogger(HelloServer.class.getName()).log( Level.SEVERE, null, ex);
}
}
});
}
@Override
public void onClose(Session session, CloseReason closeReason) {
System.out.println("Session: " +session.getId() + "CloseReason = " + closeReason);
}
@Override
public void onError (Session session, Throwable throwable) {
throwable.printStackTrace();
}
}
ServerMain.java
public class ServerMain {
public static void main(String[] args) {
Server server = new Server("localhost", 1790, "/shop", HelloServer.class);
try {
server.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Please press a key to stop the server.");
reader.readLine();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
server.stop();
}
}
}
HelloClient.java
@ClientEndpoint
public class HelloClient extends Endpoint{
private Logger logger = Logger.getLogger(this.getClass().getName());
private Session session = null;
public HelloClient(URI endpointURI){
try {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.connectToServer(this, endpointURI);
} catch (DeploymentException ex) {
Logger.getLogger(HelloClient.class.getName()).log( Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(HelloClient.class.getName()).log( Level.SEVERE, null, ex);
}
}
@Override
public void onOpen(Session session, EndpointConfig config) {
this.setSession(session);
logger.info("Connected ... " + session.getId());
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
System.out.println("Server said: "+message);
}
});
}
@Override
public void onClose(Session session, CloseReason closeReason) {
logger.info("Closing...." + closeReason);
System.out.println("Session: " +session.getId() + "CloseReason = " + closeReason);
}
@Override
public void onError (Session session, Throwable throwable) {
logger.info("Error " + throwable);
throwable.printStackTrace();
}
//get Session
public Session getSession() {
return session;
}
//set Session
public void setSession(Session session) {
this.session = session;
}
}
und ClientMain.java
public class ClientMain {
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
CountDownLatch latch = new CountDownLatch(1);
HelloClient hce = new HelloClient(new URI("ws://localhost:1790/shop/echo"));
System.out.println("nachricht?");
while (hce.getSession().isOpen()) {
String msg = reader.readLine();
hce.getSession().getBasicRemote().sendText(msg);
}
latch.await();
}
}
Großes Danke für hilfreiche Antworten
ich bin Anfänger in der Websocket-Technologie und komme bei meinem Echo-WebSocket-Programm nicht weiter.
Client und Server erben von Endpoint.
Mein Problem:
Client und Server bauen eine Verbindung auf. Im Client wird die Methode onOpen aufgerufen, aber im Server geschieht nichts. Er meldet überhaupt nichts. Auch gibt es keine Fehlermeldungen.
Mir ist klar, dass ich das über Annotationen machen kann z.B. @OnOpen, @OnMessage usw. aber möchte es speziell ohne Annotationen haben.
Soviel ich verstanden habe muss es auch ohne klappen, indem man von Endpoint erbt und die Methoden überschreibt.
hier noch mein Code:
HelloServer.java:
@ServerEndpoint(value="/echo")
public class HelloServer extends Endpoint{
//@OnOpen <<<<<<<<<<<<<<<<<< Wenn OnOpen Annotation verwendet wird klappt das mit dem Echo Programm und alles läuft wie gewollt
@Override
public void onOpen(final Session session, EndpointConfig config) {
System.out.println("in onOpen:::Server");
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException ex) {
Logger.getLogger(HelloServer.class.getName()).log( Level.SEVERE, null, ex);
}
}
});
}
@Override
public void onClose(Session session, CloseReason closeReason) {
System.out.println("Session: " +session.getId() + "CloseReason = " + closeReason);
}
@Override
public void onError (Session session, Throwable throwable) {
throwable.printStackTrace();
}
}
ServerMain.java
public class ServerMain {
public static void main(String[] args) {
Server server = new Server("localhost", 1790, "/shop", HelloServer.class);
try {
server.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Please press a key to stop the server.");
reader.readLine();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
server.stop();
}
}
}
HelloClient.java
@ClientEndpoint
public class HelloClient extends Endpoint{
private Logger logger = Logger.getLogger(this.getClass().getName());
private Session session = null;
public HelloClient(URI endpointURI){
try {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.connectToServer(this, endpointURI);
} catch (DeploymentException ex) {
Logger.getLogger(HelloClient.class.getName()).log( Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(HelloClient.class.getName()).log( Level.SEVERE, null, ex);
}
}
@Override
public void onOpen(Session session, EndpointConfig config) {
this.setSession(session);
logger.info("Connected ... " + session.getId());
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
System.out.println("Server said: "+message);
}
});
}
@Override
public void onClose(Session session, CloseReason closeReason) {
logger.info("Closing...." + closeReason);
System.out.println("Session: " +session.getId() + "CloseReason = " + closeReason);
}
@Override
public void onError (Session session, Throwable throwable) {
logger.info("Error " + throwable);
throwable.printStackTrace();
}
//get Session
public Session getSession() {
return session;
}
//set Session
public void setSession(Session session) {
this.session = session;
}
}
und ClientMain.java
public class ClientMain {
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
CountDownLatch latch = new CountDownLatch(1);
HelloClient hce = new HelloClient(new URI("ws://localhost:1790/shop/echo"));
System.out.println("nachricht?");
while (hce.getSession().isOpen()) {
String msg = reader.readLine();
hce.getSession().getBasicRemote().sendText(msg);
}
latch.await();
}
}
Großes Danke für hilfreiche Antworten