Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

minimal java8 nio secure websocket client (wss)

I've spent quite some time to find simple java websocket client that could work with wss and wont be a mess...

I've tried https://github.com/TooTallNate/Java-WebSocket

added dependency as he descirbes, copied the SSLClientExample.java to test it with websocket.org echo server, but got compile error at line 84 no such method setSocket()... (stuck here)

I tried tyrus (seems this is a big library developed directly by oracle) but it seems i need to have some appserver running (websocket container) to be able to use it...

I wonder whats so difficult about websockets that one needs to have netty or glassfish or grizly for that?

I think its possible to implement one using SSLEngine (wss) and pure java sdk... is there something i dont know about websockets? ( i imagine it very much like ordinary sockets)

like image 399
vach Avatar asked Apr 01 '15 06:04

vach


People also ask

What is WSS WebSockets?

The wss protocol establishes a WebSocket over an encrypted TLS connection, while the ws protocol uses an unencrypted connection. To establish the connection, the browser and server perform a WebSocket handshake over HTTP.

Is WSS protocol secure?

WSS is secure, so it prevents things like man-in-the-middle attacks. A secure transport prevents many attacks from the start. In conclusion, WebSockets aren't your standard socket implementation. WebSockets are versatile, the established connection is always open, and messages can be sent and received continuously.

How do I connect my WSS WebSocket?

To open a websocket connection, we need to create new WebSocket using the special protocol ws in the url: let socket = new WebSocket("ws://javascript.info"); There's also encrypted wss:// protocol. It's like HTTPS for websockets.

How do I enable WSS protocol?

- In Control Panel, click Programs and Features, and then click Turn Windows features on or off. Expand Internet Information Services, expand World Wide Web Services, expand Application Development Features, and then select WebSocket Protocol. Click OK. Click Close.


2 Answers

nv-websocket-client is a new WebSocket client library written in Java. It supports wss and requires just Java SE 1.5, so it can run even on Android.

The size of nv-websocket-client-1.3.jar (released on 2015-05-06) is 62,854 bytes and it does not require any external dependencies.

Below is a "wss" example.

import com.neovisionaries.ws.client.*;

public class HelloWSS
{
    public static void main(String[] args) throws Exception
    {
        // Connect to "wss://echo.websocket.org" and send "Hello." to it.
        // When a response from the WebSocket server is received, the
        // WebSocket connection is closed.
        new WebSocketFactory()
            .createSocket("wss://echo.websocket.org")
            .addListener(new WebSocketAdapter() {
                @Override
                public void onTextMessage(WebSocket ws, String message) {
                    // Received a response. Print the received message.
                    System.out.println(message);

                    // Close the WebSocket connection.
                    ws.disconnect();
                }
            })
            .connect()
            .sendText("Hello.");
    }
}

Blog
WebSocket client library (Java SE 1.5+, Android)
http://darutk-oboegaki.blogspot.jp/2015/05/websocket-client-library-java-se-15.html

GitHub
https://github.com/TakahikoKawasaki/nv-websocket-client

JavaDoc
http://takahikokawasaki.github.io/nv-websocket-client/

Maven

<dependency>
    <groupId>com.neovisionaries</groupId>
    <artifactId>nv-websocket-client</artifactId>
    <version>1.3</version>
</dependency>
like image 131
Takahiko Kawasaki Avatar answered Sep 21 '22 13:09

Takahiko Kawasaki


Tyrus client does not need to have an appserver! :)

Please see Tyrus documentation and blogpost Reducing WebSocket client jar size with ProGuard (you can get down to 500 kB with JDK 7+).

About the size - it can be minimized even more, but with some refactoring in Tyrus code. The comparison of WebSocket and plain socket is not very accurate - plain socket does not need to implement HTTP and (traditionally) did not have NIO support (that came with Java 7). Another part is the WebSocket protocol implementation, which is not that difficult but also its not just sending byte[] to the wire - there is some opening handshake, signalling frames and mandatory strict UTF-8 encoding/decoding.

So I guess you could find more simple API implementation, but sticking to something which is maintained and is part of Java EE does not seem bad to me - you have the possibility to choose the implementation (Tyrus is just one of them, there are others) and your client will be ready for inclusion to Java EE application if that would ever happen. (Editors note: I work on Tyrus, so my answer is most likely biased).

like image 30
Pavel Bucek Avatar answered Sep 25 '22 13:09

Pavel Bucek