0

I'm trying to implement a Websocket with Tomcat 8.0.28 (not Tomcat 7) and Struts 2. But I get a HTTP ERROR 404, when I try to connect to it from JavaScript. I have already checked, if there are any tomcat-apis in the WEB-INF/lib folder but there aren't any.

Here's my code for the Websocket:

package de.whs.ms.struts.websocket;

import de.whs.ms.services.Log;
import de.whs.ms.services.TinsServer;
import de.whs.ms.struts.websocket.coder.RFIDDecoder;
import de.whs.ms.struts.websocket.coder.RFIDEncoder;
import models.RfidDevice;
import net.ThirdIndustries.Exceptions.InvalidTypeException;
import net.ThirdIndustries.KSON.KSONObject;
import net.ThirdIndustries.NetworkProtocol.MessageMeta;
import net.ThirdIndustries.NetworkProtocol.NetworkProtocol;
import net.ThirdIndustries.NetworkProtocol.iNetworkMeta;
import net.ThirdIndustries.TINSServer.IMessageRecievedListener;
import net.ThirdIndustries.TINSServer.TINSClientServer;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
* Created by Maren on 15.12.16.
*/

@ServerEndpoint(value="/websocket", encoders = RFIDEncoder.class, decoders = RFIDDecoder.class)
public class Websocket implements IMessageRecievedListener {

    private RfidDevice rfidDevice;

    private Set<Session> userSessions = Collections.synchronizedSet(new HashSet<>());

    @OnOpen
    public void onOpen(Session userSession){
        System.out.println("< ----------- ON OPEN ----------- >");

        if(!userSessions.contains(userSession)){
            userSessions.add(userSession);
        }
    }

    @OnMessage
    public void onMessage(String message, Session session){
        System.out.println("< ----------- ON MESSAGE ----------- >");
        System.out.println("Client sendet: " + session);
        System.out.println("Message empfangen: " + message);

        try {
            session.getBasicRemote().sendObject(rfidDevice);
        } catch (IOException | EncodeException ex) {
            ex.printStackTrace();
        }
    }

    @OnClose
    public void onClose(Session session){
        System.out.println("< ----------- ON CLOSE ----------- >");
        userSessions.remove(session);
    }
}

Here's my code for the Javascript-File:

<script type="text/javascript">
    var websocket;
    var messages = document.getElementById("messages");

    function openSocket(){
        if(websocket !== undefined && websocket.readyState !== WebSocket.CLOSED){
            writeResponse("Websocket is already opened");
            return;
        }

        //Create a new instance of websocket
        websocket = new WebSocket("ws://localhost:8080/ms/websocket");

        //Binds functions to the listeners for the websocket
        websocket.onopen = function(event){
            if(event.data === undefined)
                return;
            writeResponse(event.data);
        };

        websocket.onmessage = function(event){
            writeResponse(event.data);
        };

        websocket.onclose = function(event){
            writeResponse("Connection closed");
        };
    }

    function send(){
        var text = "balalalala";
        websocket.send(text);
    }

    function closeSocket(){
        websocket.close();
    }

    function writeResponse(text){
        messages.innerHTML = "Message empfangen: " + text;
    }
</script>

Moreover i have excluded the "*/websocket" from struts:

<constant name="struts.action.excludePattern" value="/websocket.*?"/>
<constant name="struts.action.excludePattern" value="^ws://.+$"/>

Still it doesn't work.

Bellara
  • 1
  • 1

0 Answers0