-
Notifications
You must be signed in to change notification settings - Fork 50
Description
Server: Wildfly 10.1
Browser: Chrome
Frontend: Reactjs
Socket server: engine.io-server-java V 1.3.4
Socket client: engine.io-client V 3.4.0
Note: Followed the below documentation link to host the generic java engine.io server.
https://socketio.github.io/engine.io-server-java/using.html
Issue: When the UI is launched, engine.io triggers the connection request to the sever. When checking the sever log connection request is reached the servlet, now the issue is client is continuously sending the connection request to servlet and WebSocket connection is not establishing it goes like a never-ending process. Attacthed the source for the reference please check and advice want went wrong in the code.
Project Structure:
ReactJS as front-end:
App.JS
import React from 'react';
var enginesocket = require('engine.io-client')('ws://localhost:8080', { transport: ["websocket"],
upgrade: true, reconnection: false });
class App extends React.Component {
componentDidMount() {
enginesocket.on('open', function () {
console.log("Opened");
enginesocket.on('message', function (data) {
console.log("Message from server :: ", data);
});
});
}
}
EngineIoServlet -
URLPattens is kept as "/" since WAR file name is "engine.io". So the context "/engine.io/" will be exposed by wildfly server.
@WebServlet(name = "EngineIoServlet", urlPatterns = {"/"})
public class EngineIoServlet extends HttpServlet {
private final EngineIoServer mEngineIoServer = new EngineIoServer();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("mEngineIoServer?? " + mEngineIoServer);
mEngineIoServer.handleRequest(request, response);
mEngineIoServer.on("connection", new Emitter.Listener() {
@Override
public void call(Object... args) {
EngineIoSocket socket = (EngineIoSocket) args[0];
// Do something with socket like store it somewhere
System.out.println("socket :: " + socket);
socket.on("packet", new Emitter.Listener() {
@Override
public void call(Object... args) {
Packet packet = (Packet) args[0];
// Do something with packet.
System.out.println("packet :: " + packet.data);
}
});
socket.on("message", new Emitter.Listener() {
@Override
public void call(Object... args) {
Object message = args[0];
// message can be either String or byte[]
// Do something with message.
System.out.println("message ::" + message);
}
});
socket.send(new Packet<>(Packet.MESSAGE, "foo"));
}
});
}
ApplicationServerConfig
public final class ApplicationServerConfig implements ServerApplicationConfig {
@Override
public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses) {
final HashSet<ServerEndpointConfig> result = new HashSet<>();
result.add(ServerEndpointConfig.Builder
.create(EngineIoEndpoint.class, "/")
.build());
return result;
}
@Override
public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
return null;
}
}
EngineIoEndpoint
public final class EngineIoEndpoint extends Endpoint {
private Session mSession;
private Map<String, String> mQuery;
private EngineIoWebSocket mEngineIoWebSocket;
private EngineIoServer mEngineIoServer; // The engine.io server instance
@Override
public void onOpen(Session session, EndpointConfig endpointConfig) {
mSession = session;
mQuery = ParseQS.decode(session.getQueryString());
System.out.println("inside socket onOpen");
mEngineIoWebSocket = new EngineIoWebSocketImpl();
/*
* These cannot be converted to lambda because of runtime type inference
* by server.
*/
mSession.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
mEngineIoWebSocket.emit("message", message);
}
});
mSession.addMessageHandler(new MessageHandler.Whole<byte[]>() {
@Override
public void onMessage(byte[] message) {
mEngineIoWebSocket.emit("message", (Object) message);
}
});
mEngineIoServer.handleWebSocket(mEngineIoWebSocket);
}
@Override
public void onClose(Session session, CloseReason closeReason) {
super.onClose(session, closeReason);
mEngineIoWebSocket.emit("close");
mSession = null;
}
@Override
public void onError(Session session, Throwable thr) {
super.onError(session, thr);
mEngineIoWebSocket.emit("error", "unknown error", thr.getMessage());
}
private class EngineIoWebSocketImpl extends EngineIoWebSocket {
private RemoteEndpoint.Basic mBasic;
EngineIoWebSocketImpl() {
mBasic = mSession.getBasicRemote();
}
@Override
public Map<String, String> getQuery() {
return mQuery;
}
@Override
public void write(String message) throws IOException {
mBasic.sendText(message);
}
@Override
public void write(byte[] message) throws IOException {
mBasic.sendBinary(ByteBuffer.wrap(message));
}
@Override
public void close() {
try {
mSession.close();
} catch (IOException ignore) {
}
}
}
}

