Skip to content

Commit fb407e5

Browse files
committed
Merge pull request TooTallNate#116 from Davidiusdadi/master
nonblocking wss and bugfixes
2 parents f28a37a + b7cab91 commit fb407e5

14 files changed

+638
-151
lines changed

example/SSLClientExample.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import java.io.BufferedReader;
2+
import java.io.File;
3+
import java.io.FileInputStream;
4+
import java.io.InputStreamReader;
5+
import java.net.URI;
6+
import java.security.KeyStore;
7+
8+
import javax.net.ssl.KeyManagerFactory;
9+
import javax.net.ssl.SSLContext;
10+
import javax.net.ssl.TrustManagerFactory;
11+
12+
import org.java_websocket.WebSocket;
13+
import org.java_websocket.client.DefaultSSLWebSocketClientFactory;
14+
import org.java_websocket.client.WebSocketClient;
15+
import org.java_websocket.handshake.ServerHandshake;
16+
17+
class WebSocketChatClient extends WebSocketClient {
18+
19+
public WebSocketChatClient( URI serverUri ) {
20+
super( serverUri );
21+
}
22+
23+
@Override
24+
public void onOpen( ServerHandshake handshakedata ) {
25+
System.out.println( "Connected" );
26+
27+
}
28+
29+
@Override
30+
public void onMessage( String message ) {
31+
System.out.println( "got: " + message );
32+
33+
}
34+
35+
@Override
36+
public void onClose( int code, String reason, boolean remote ) {
37+
System.out.println( "Disconnected" );
38+
System.exit( 0 );
39+
40+
}
41+
42+
@Override
43+
public void onError( Exception ex ) {
44+
ex.printStackTrace();
45+
46+
}
47+
48+
}
49+
50+
public class SSLClientExample {
51+
52+
/*
53+
* Keystore with certificate created like so (in JKS format):
54+
*
55+
*keytool -genkey -validity 3650 -keystore "keystore.jks" -storepass "storepassword" -keypass "keypassword" -alias "default" -dname "CN=127.0.0.1, OU=MyOrgUnit, O=MyOrg, L=MyCity, S=MyRegion, C=MyCountry"
56+
*/
57+
public static void main( String[] args ) throws Exception {
58+
WebSocket.DEBUG = true;
59+
60+
WebSocketChatClient chatclient = new WebSocketChatClient( new URI( "wss://localhost:8887" ) );
61+
62+
// load up the key store
63+
String STORETYPE = "JKS";
64+
String KEYSTORE = "keystore.jks";
65+
String STOREPASSWORD = "storepassword";
66+
String KEYPASSWORD = "keypassword";
67+
68+
KeyStore ks = KeyStore.getInstance( STORETYPE );
69+
File kf = new File( KEYSTORE );
70+
ks.load( new FileInputStream( kf ), STOREPASSWORD.toCharArray() );
71+
72+
KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
73+
kmf.init( ks, KEYPASSWORD.toCharArray() );
74+
TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
75+
tmf.init( ks );
76+
77+
SSLContext sslContext = null;
78+
sslContext = SSLContext.getInstance( "TLS" );
79+
sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null );
80+
81+
chatclient.setWebSocketFactory( new DefaultSSLWebSocketClientFactory( sslContext ) );
82+
83+
chatclient.connect();
84+
85+
BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
86+
while ( true ) {
87+
chatclient.send( reader.readLine() );
88+
}
89+
90+
}
91+
}
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,25 @@
33
import java.io.IOException;
44
import java.net.Socket;
55
import java.nio.channels.ByteChannel;
6-
import java.nio.channels.SocketChannel;
6+
import java.nio.channels.SelectionKey;
77
import java.security.KeyStore;
88
import java.util.List;
9+
import java.util.concurrent.ExecutorService;
10+
import java.util.concurrent.Executors;
911

1012
import javax.net.ssl.KeyManagerFactory;
1113
import javax.net.ssl.SSLContext;
1214
import javax.net.ssl.SSLEngine;
1315
import javax.net.ssl.TrustManagerFactory;
1416

15-
import org.java_websocket.SSLSocketChannel;
17+
import org.java_websocket.SSLSocketChannel2;
1618
import org.java_websocket.WebSocket;
1719
import org.java_websocket.WebSocketAdapter;
1820
import org.java_websocket.WebSocketImpl;
1921
import org.java_websocket.drafts.Draft;
2022
import org.java_websocket.server.WebSocketServer;
2123

22-
public class SSLExample {
24+
public class SSLServerExample {
2325

2426
/*
2527
* Keystore with certificate created like so (in JKS format):
@@ -59,15 +61,17 @@ public static void main( String[] args ) throws Exception {
5961

6062
class SSLWebSocketServerFactory implements WebSocketServer.WebSocketServerFactory {
6163
private SSLContext sslcontext;
64+
private ExecutorService exec = Executors.newSingleThreadScheduledExecutor();
65+
6266
SSLWebSocketServerFactory( SSLContext sslContext ) {
6367
this.sslcontext = sslContext;
6468
}
6569

6670
@Override
67-
public ByteChannel wrapChannel( SocketChannel c ) throws IOException {
71+
public ByteChannel wrapChannel( SelectionKey c ) throws IOException {
6872
SSLEngine e = sslcontext.createSSLEngine();
6973
e.setUseClientMode( false );
70-
return new SSLSocketChannel( c, e );
74+
return new SSLSocketChannel2( c, e, exec );
7175
}
7276

7377
@Override

0 commit comments

Comments
 (0)