jgr208
jgr208

Reputation: 3066

Tomcat clientendpoint websocket keeps closing

I have the following clientendpoint class for a websocket in tomcat 7.0.53. It is based off of this example on a website https://blog.openshift.com/how-to-build-java-websocket-applications-using-the-jsr-356-api/

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;

import javax.websocket.ClientEndpoint;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.DeploymentException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
@ClientEndpoint
public class connect {
    private static ArrayList<Session> sessionList = new ArrayList<Session>();

    public connect(URI endpointURI) throws DeploymentException, IOException
    {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        container.connectToServer(this, endpointURI);
    }

    @OnOpen
    public void onOpen(Session session) throws IOException
    {
        sessionList.add(session);
        System.out.println(session.getId());
        session.getBasicRemote().sendText("hello");
    }

    public void sendMessage(String message) throws IOException
    {
        for(Session session : sessionList){
            //asynchronous communication
            session.getBasicRemote().sendText(message);
        }
    }

    @OnClose
    public void onClose(Session session){
        sessionList.remove(session);
        System.out.println("here");
    }

    @OnError
    public void onError(Throwable t, Session session){
        System.out.println("tedt");  
    }
}

I then have the following code to start the client endpoint

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import javax.websocket.DeploymentException;


public class test {

    public static void main(String[] args) throws DeploymentException, IOException, URISyntaxException {
        // TODO Auto-generated method stub
        connect connect = new connect(new URI("ws://localhost:8080/example/talk"));
        connect.sendMessage("now");
    }

}

The client does successfully connect to the websocket server, however then it gets disconnected right away when I try to send a message or do anything, I know this since the onError function is being called when I try to send a message from the onOpen function. Why is the websocket getting closed immediately after it is connected to the server?

Upvotes: 1

Views: 2010

Answers (1)

Christopher Schultz
Christopher Schultz

Reputation: 20837

You are being disconnected because your main thread in your client application is ending. After you send "now", your program simply exits. If you want to do anything else (like wait for a response from the server, for instance), then you'll have to prevent the main thread from exiting. Try something like this at the end of your main method:

System.in.read();

This will cause your process to sit and wait for input from standard input. Simply wait for your test to complete and then press ENTER on the command-line to terminate the client.

You will, of course, want to register a handler for receiving messages back from the server to the client. Right now, you can only send messages from the client to the server.

Upvotes: 2

Related Questions