I am trying to implement a websocket on tomcat 7.0.50 using annotated endpoints as specified in Java Websocket API (1.0)- JSR 356. Following are the brief steps how I have coded it 1) Write a websocket endpoint using @ServerEndpoint annotation 2) implement @onOpen and @onMessage methods 3) open a websocket using javascript on google chrome.
Please find code corresponding to above steps in order
1) STEP 1 & 2 - writing websocket server endpoint:
package com.jkweb.websocket;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.websocket.EndpointConfig;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ServerEndpoint(value="/websocket/fileuploadtracker")
@OnOpen
public void open(Session session,EndpointConfig config) {
......
}
@OnMessage
public void onMessage(Session session, String msg) {
try {
session.getBasicRemote().sendText(msg);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
public static void sendMessage(String uniqueTocken,String msg){
try {
Session wsSession = socketConnectionMap.get(uniqueTocken);
wsSession.getBasicRemote().sendText(msg);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
}
2) STEP 3 - opening websocket using javascript api in chrome:
wsurl = "ws://localhost:8080/jkweb/websocket/fileuploadtracker",
ws;
ws = new WebSocket(wsurl);
ws.onopen = function()
{
// Web Socket is connected, send data using send()
ws.send("Sending first Message");
alert("Message is sent...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert("Message is received...");
};
ws.onclose = function(evt)
{
// websocket is closed.
alert("Connection is closed..."+evt.code + ":"+evt.reason );
};
I am using following versions of softwares : 1) Tomcat - 7.0.50 2) Java - 1.7.45 3) Servlet - 3.0 4) Have included following Maven dependency 5) Chrome - 32.0.1700.107m
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
However I am getting following error and connection is closed with 1066 error code in chrome's console:
WebSocket connection to 'ws://localhost:8080/jkweb/websocket/fileuploadtracker' failed: Error during WebSocket handshake: Unexpected response code: 404
Is there any configuration I am missing out on. I tried to search a lot but couldn't find anything. Please I need this to be solved ASAP.
I am trying to implement a websocket on tomcat 7.0.50 using annotated endpoints as specified in Java Websocket API (1.0)- JSR 356. Following are the brief steps how I have coded it 1) Write a websocket endpoint using @ServerEndpoint annotation 2) implement @onOpen and @onMessage methods 3) open a websocket using javascript on google chrome.
Please find code corresponding to above steps in order
1) STEP 1 & 2 - writing websocket server endpoint:
package com.jkweb.websocket;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.websocket.EndpointConfig;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ServerEndpoint(value="/websocket/fileuploadtracker")
@OnOpen
public void open(Session session,EndpointConfig config) {
......
}
@OnMessage
public void onMessage(Session session, String msg) {
try {
session.getBasicRemote().sendText(msg);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
public static void sendMessage(String uniqueTocken,String msg){
try {
Session wsSession = socketConnectionMap.get(uniqueTocken);
wsSession.getBasicRemote().sendText(msg);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
}
2) STEP 3 - opening websocket using javascript api in chrome:
wsurl = "ws://localhost:8080/jkweb/websocket/fileuploadtracker",
ws;
ws = new WebSocket(wsurl);
ws.onopen = function()
{
// Web Socket is connected, send data using send()
ws.send("Sending first Message");
alert("Message is sent...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert("Message is received...");
};
ws.onclose = function(evt)
{
// websocket is closed.
alert("Connection is closed..."+evt.code + ":"+evt.reason );
};
I am using following versions of softwares : 1) Tomcat - 7.0.50 2) Java - 1.7.45 3) Servlet - 3.0 4) Have included following Maven dependency 5) Chrome - 32.0.1700.107m
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
However I am getting following error and connection is closed with 1066 error code in chrome's console:
WebSocket connection to 'ws://localhost:8080/jkweb/websocket/fileuploadtracker' failed: Error during WebSocket handshake: Unexpected response code: 404
Is there any configuration I am missing out on. I tried to search a lot but couldn't find anything. Please I need this to be solved ASAP.
Share Improve this question edited Oct 31, 2017 at 13:07 alseether 1,9932 gold badges26 silver badges41 bronze badges asked Feb 18, 2014 at 11:32 Shailesh VaishampayanShailesh Vaishampayan 1,7965 gold badges24 silver badges52 bronze badges3 Answers
Reset to default 13I have solved it. Problem was very specific to my installation. I had the websocket api .jar being installed in my app's WEB-INF/lib directory as well. Not sure why it was breaking it. can you put some light on the root cause of this behaviour and why it doesn't work when you gave websocket-api.jar in application's WEB-INF/lib along with tomcat's lib?
If you used tomcat server which was created in eclipse, you should delete the old server and create a new one with tomcat 7.0.50. This is my solution. PS: My tomcat server is 7.0.53, and the old one is 7.0.21. Good luck to you~
I also had the same problem. Try removing the unwanted jars which contains websocket in your $JAVA_HOME/lib folder. and then add only