Skip to content

Instantly share code, notes, and snippets.

@chitan
Created July 7, 2012 01:44
Show Gist options
  • Save chitan/3063774 to your computer and use it in GitHub Desktop.
Save chitan/3063774 to your computer and use it in GitHub Desktop.
How to use WebSocket of Tomcat
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>Tomcat WebSocket Chat</title>
<script>
var ws = new WebSocket("ws://localhost:8080/TomcatWebSocket/wschat/WsChatServlet");
ws.onopen = function(){
};
ws.onmessage = function(message){
document.getElementById("chatlog").textContent += message.data + "\n";
};
function postToServer(){
ws.send(document.getElementById("msg").value);
document.getElementById("msg").value = "";
}
function closeConnect(){
ws.close();
}
</script>
</head>
<body>
<textarea id="chatlog" readonly></textarea><br/>
<input id="msg" type="text" />
<button type="submit" id="sendButton" onClick="postToServer()">Send!</button>
<button type="submit" id="sendButton" onClick="closeConnect()">End</button>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>WsChatServlet</servlet-name>
<servlet-class>wsapp.WsChatServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WsChatServlet</servlet-name>
<url-pattern>/wschat/WsChatServlet</url-pattern>
</servlet-mapping>
</web-app>
//This sample is how to use websocket of Tomcat.
package wsapp;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
public class WsChatServlet extends WebSocketServlet{
private static final long serialVersionUID = 1L;
private static ArrayList<MyMessageInbound> mmiList = new ArrayList<MyMessageInbound>();
public StreamInbound createWebSocketInbound(String protocol){
return new MyMessageInbound();
}
private class MyMessageInbound extends MessageInbound{
WsOutbound myoutbound;
@Override
public void onOpen(WsOutbound outbound){
try {
System.out.println("Open Client.");
this.myoutbound = outbound;
mmiList.add(this);
outbound.writeTextMessage(CharBuffer.wrap("Hello!"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onClose(int status){
System.out.println("Close Client.");
mmiList.remove(this);
}
@Override
public void onTextMessage(CharBuffer cb) throws IOException{
System.out.println("Accept Message : "+ cb);
for(MyMessageInbound mmib: mmiList){
CharBuffer buffer = CharBuffer.wrap(cb);
mmib.myoutbound.writeTextMessage(buffer);
mmib.myoutbound.flush();
}
}
@Override
public void onBinaryMessage(ByteBuffer bb) throws IOException{
}
}
}
@saswatanand
Copy link

Thanks! The code snippet was useful to me.

@thomasrossetto
Copy link

thank you very much !

@nirajsalot
Copy link

Thanks for sharing this

@rendeddula
Copy link

i am getting some library files missing exceptions. can you send me war file for this project.

@sulmansarwar
Copy link

can you please provide the maven dependencies for this gist? Thanks.

@sourav301
Copy link

Thanks Chitan. I was searching for an implementation of websocket and your example helped a lot. It worked perfect on different browsers on a computer. But i dont know way it did not work across different computers. i.e. messages from one computer is not being delivered to other computer.
Where is the problem?

@robbyn
Copy link

robbyn commented Nov 25, 2013

Hi there, I was wondering if the mmiList should be protected against concurrent usage.

@IslamBesto
Copy link

I'm using the tomcat version 7.0.39 and it does'nt work for me, it generate this exception :

GRAVE: "Servlet.service()" pour la servlet WsChatServlet a généré une exception
java.lang.ClassCastException: org.apache.coyote.Request cannot be cast to org.apache.coyote.http11.upgrade.UpgradeInbound

Copy link

ghost commented Jan 29, 2014

This code only works with Tomcat 7. Tomcat 8 the websocket classes appear to have been refactored.

@joleye
Copy link

joleye commented Mar 4, 2014

@IslamBesto I'm using the tomcat version 7.0.34,And your mistakes as

@bromokun
Copy link

I'm using Tomcat 7.0.52 version ... I cannot get the outbound part sending "Hello client" after connected, only when I turn off my tomcat, my client receives "Hello client" ... and I haven't make any changes ... why???
Btw, I changed the protocol to NIO on tomcat server.xml.

@chitan
Copy link
Author

chitan commented Mar 25, 2014

If you can use Tomcat 7.0.52, look at here.
https://gist.github.com/chitan/9761824

@AiRmode
Copy link

AiRmode commented Jun 8, 2014

If anybody need pom.xml example for this project-here it is. I've just done it and test

<groupId>wschat</groupId>
<artifactId>wschat</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>wschat</name>
<url>http://example.com</url>

<dependencies>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-catalina</artifactId>
        <version>7.0.39</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-coyote</artifactId>
        <version>7.0.27</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <webXml>WEB-INF\web.xml</webXml>
            </configuration>
        </plugin>
    </plugins>
</build>

@chitan
Copy link
Author

chitan commented Aug 9, 2014

@AiRmode thanks!

@srikanthgt
Copy link

WebSocket is working fine on tomcat 7 but i could fidn the same jars in tomcat 8 ,please help me out

@mahantheshp
Copy link

I am getting exception below exception,while staring the server.(D:\novworkspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\lexus-drivers-webapp\WEB-INF\lib\tomcat-servlet-api-7.0.27.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class

@jaygajera
Copy link

can i get all the material of wesocket?

@achyut
Copy link

achyut commented Mar 28, 2016

Thank a lot!

@pavelantushevich
Copy link

Where did you get the package "org.apache.catalina.websocket" from?
Somehow my catalina.jar (from Tomcat 9) don't has it.
And I can't find it somewhere.
Please, give me link of needed lib or official resourse url.

@CFM880
Copy link

CFM880 commented Mar 17, 2017

@pavelantushevich
WebSocketServlet Deprecated.
Replaced by the JSR356 WebSocket 1.1 implementation and will be removed in Tomcat 8.0.x.
WebSocketServlet @doc

@mnsuccess
Copy link

Thank a lot! good

@bhargavbhegde7
Copy link

Thanks!

Copy link

ghost commented Jan 23, 2018

This is a great code thank you. Going to run it on my site.

@DCubix
Copy link

DCubix commented Aug 26, 2019

Doesn't work with Tomcat 9

@VashishthSingh
Copy link

Can want java code for client side not the javascript code can anyone provide me plz.TQ

@Sivanesan1996m
Copy link

how to solve this error
error: package org.apache.catalina.websocket does not exist
import org.apache.catalina.websocket.MessageInbound;

Note : already import org.apache.catalina.websocket.* jar file

@natsiosti
Copy link

I am trying Dr. Danny Coward's code on pp6 of his Websocket book but has been returning an 'undefined' error for years. Could someone look at Dr. Coward's code and tell where I am getting wrong.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment