minimal java8 nio secure websocket client (wss)
Asked Answered
A

4

10

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)

Averill answered 1/4, 2015 at 6:45 Comment(0)
A
22

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>
Acrosstheboard answered 6/5, 2015 at 6:50 Comment(6)
I'm adding it as dependency but seems its not in a public repo, are you sure there is no specific repository to be added? Also is .connect() a blocking call?Averill
You can find it in the Maven Central Repository. connect() method blocks until WebSocket opening handshake is done. After a successful handshake, two internal threads are started and connect() method returns. Sending and receiving WebSocket frames are performed asynchronously. See Blog, JavaDoc or README.md for details.Acrosstheboard
Just tried it and this library of yours is brilliant, thanks a million!Elfish
Was using mvnrepository.com/artifact/javax.websocket/… but it just stopped working with unexplained errors once I moved to a secure socket. Tried this library and it worked first time. Great work!Lecher
make sure you get latest version. Currently has gone much further than 1.3 and current version is 2.9Reo
What's the performance diff between nv-websocket-client and netty?Influenza
I
3

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).

Irishman answered 1/4, 2015 at 7:38 Comment(11)
I like tyrus, afterall its maintained by oracle guys, thanks for the link, i'll check it out, and try... if it works i'll post here... i only need wss supporting websocket client, without any jetty netty or any fishes :)))Averill
Pavel I can see you develop a lot of it, i'm having 2 problems now, please help with these if you have some time. It works now without any appserver which is what i naturally expected of it, but 1. now i need to configure the SSLContextConfigurator, which is not in my dependencies ( i only have now "tyrus-container-jdk-client" 1.10 ) what else do i need? 2. I dont really know what are keystore/thruststore, and how do i create them for a particular domain... I've successfully added new ssl certificates in java cacerts but this seems something different... Where could i read about this?Averill
you don't need to set SSLContextConfigurator - if your JDK is properly configured, it will be picked up automatically. SslContextConfigurator is in org.glassfish.tyrus:tyrus-client module (please use same version - 1.10 in your case). And you can also benefit from "all-in-one standalone bundle": org.glassfish.tyrus.bundles:tyrus-standalone-client-jdk; search.maven.org/… .Irishman
Pavel do i understand this right. I'm tryting to consume wss://api.poloniex.com with (wss://echo.websocket.org) it works fine, but with poloniex it throws sslhandshake exception (more information needed to validate cert... etc) now i exported .cer file, imported it in new mycerts truststore, and passed it as jvm argument... but it still trows exception... maybe you know what i'm doing wrong? shouldnt this work? (i undesrtand that i dont need the keystore thing only truststore... as i'm consuming the api)Averill
I downloaded certificate from the browser when opening poloniex.com but i'm not sure if this certificate also applies to wss://api.poloniex.comAverill
Also Pavel i read that you work on java8 version, is there the jdk java8 version? that would be perfect for me...Averill
I saw "tyrus-container-inmemory" in maven repos, but couldnt find information about it in your blog or in tyrus guide... I hope i dont annoy with so many questions, its just seems to mee this topic is covered very poorly, your blog helps a bit but really its just unstructured bits of information.Averill
try the client again with -Djavax.net.debug=all (see docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/…) .. that should help you understand what is missing in your truststore. Make sure that you have complete chain there - check who signed the cert for poloniex etc..Irishman
client/server in-memory won't help you, that does not access anything over network, it's just what it is - inmemory transport, mainly used for testing and performance evaluation.Irishman
and about java8 version - there is currently only this: blogs.oracle.com/PavelBucek/entry/websocket_client_api_java_8 and it is not part of any stable release yet. It should be when Tyrus 1.11 is out, maybe with some other extensions.Irishman
I've changed jdk container to grizzly and it started to get different error "org.glassfish.tyrus.core.HandshakeException: Response code was not 101: 400." Also How do i subscribe to a feed once connected?Averill
I
0

Try Matthias's simple-websocket-client out. (I'm just one of his followers in Twitter) You may agree his underlying intention of that project.

From https://github.com/matzew/simple-websocket-client

The JSR 356 describes a standard API for WebSocket Server and clients, but the client API is very complex. This project aims to offer a simplified client.

BTW, Any WebSocket client doesn't require WebSocket server and it's possible to write your own client on pure Java SE. However, since ease to integrate with other technologies is much important than just simpleness, you might feel there's some underlying context which looks complex and unnecessary.

Inhalation answered 1/4, 2015 at 14:25 Comment(1)
Thanks, for the link, but as far as i see it does not support wss secure connections which is what i need.Averill
S
0

GO for Java Webscoket API, Simple And elegant.

Sulfa answered 28/3, 2020 at 3:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.