Skip to content

Commit 5bbbc62

Browse files
committed
Merge pull request TooTallNate#99 from Davidiusdadi/master
merged a first draft of wss support for the server, fixes for TooTallNate#98 and a bunch of internal refactoring
2 parents 8ef67b4 + 8ce0e34 commit 5bbbc62

17 files changed

Lines changed: 593 additions & 259 deletions

‎README.markdown‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Implemented WebSocket protocol versions are:
1313
* [Hixie 76](http://tools.ietf.org/id/draft-hixie-thewebsocketprotocol-76.txt)
1414
* [Hybi 10](http://tools.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-10.txt)
1515
* [Hybi 17](http://tools.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-17.txt)
16+
* [RFC 6455](http://tools.ietf.org/html/rfc6455)
1617

1718

1819
Running the Example

‎example/AutobahnClientTest.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import java.nio.ByteBuffer;
66

77
import org.java_websocket.WebSocket;
8-
import org.java_websocket.WebSocketClient;
8+
import org.java_websocket.client.WebSocketClient;
99
import org.java_websocket.drafts.Draft;
1010
import org.java_websocket.drafts.Draft_17;
1111
import org.java_websocket.handshake.ServerHandshake;

‎example/AutobahnServerTest.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
import java.util.Collections;
55

66
import org.java_websocket.WebSocket;
7-
import org.java_websocket.WebSocketServer;
87
import org.java_websocket.drafts.Draft;
98
import org.java_websocket.drafts.Draft_17;
109
import org.java_websocket.handshake.ClientHandshake;
10+
import org.java_websocket.server.WebSocketServer;
1111

1212
public class AutobahnServerTest extends WebSocketServer {
1313
private static int counter = 0;

‎example/ChatClient.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import javax.swing.JTextField;
1515

1616
import org.java_websocket.WebSocket;
17-
import org.java_websocket.WebSocketClient;
17+
import org.java_websocket.client.WebSocketClient;
1818
import org.java_websocket.drafts.Draft;
1919
import org.java_websocket.drafts.Draft_10;
2020
import org.java_websocket.drafts.Draft_17;

‎example/ChatServer.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import java.util.Set;
77

88
import org.java_websocket.WebSocket;
9-
import org.java_websocket.WebSocketServer;
109
import org.java_websocket.handshake.ClientHandshake;
10+
import org.java_websocket.server.WebSocketServer;
1111

1212
/**
1313
* A simple WebSocketServer implementation. Keeps track of a "chatroom".

‎example/ExampleClient.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import java.net.URI;
22
import java.net.URISyntaxException;
33

4-
import org.java_websocket.WebSocketClient;
4+
import org.java_websocket.client.WebSocketClient;
55
import org.java_websocket.drafts.Draft;
66
import org.java_websocket.drafts.Draft_10;
77
import org.java_websocket.handshake.ServerHandshake;

‎example/SSLServer.java‎

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
// @formatter:off
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.net.InetAddress;
6+
import java.net.InetSocketAddress;
7+
import java.net.Socket;
8+
import java.nio.channels.SocketChannel;
9+
import java.security.KeyStore;
10+
import java.util.List;
11+
12+
import javax.net.ssl.KeyManagerFactory;
13+
import javax.net.ssl.SSLContext;
14+
import javax.net.ssl.SSLEngine;
15+
import javax.net.ssl.TrustManagerFactory;
16+
17+
import org.java_websocket.SSLSocketChannel;
18+
import org.java_websocket.WebSocket;
19+
import org.java_websocket.WebSocketAdapter;
20+
import org.java_websocket.WebSocketImpl;
21+
import org.java_websocket.drafts.Draft;
22+
import org.java_websocket.handshake.ClientHandshake;
23+
import org.java_websocket.server.WebSocketServer;
24+
25+
/*
26+
* Create the appropriate websocket server.
27+
*/
28+
public class SSLServer implements WebSocketServer.WebSocketServerFactory
29+
{
30+
private static final String STORETYPE = "JKS";
31+
private static final String KEYSTORE = "keystore.jks";
32+
private static final String STOREPASSWORD = "storepassword";
33+
private static final String KEYPASSWORD = "keypassword";
34+
35+
public static void main(String[] args) throws Exception
36+
{
37+
new SSLServer();
38+
}
39+
40+
private SSLContext sslContext;
41+
42+
void loadFromFile() throws Exception
43+
{
44+
// load up the key store
45+
KeyStore ks = KeyStore.getInstance(STORETYPE);
46+
File kf = new File(KEYSTORE);
47+
ks.load(new FileInputStream(kf), STOREPASSWORD.toCharArray());
48+
49+
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
50+
kmf.init(ks, KEYPASSWORD.toCharArray());
51+
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
52+
tmf.init(ks);
53+
54+
sslContext = SSLContext.getInstance("TLS");
55+
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
56+
}
57+
58+
/*
59+
* Keystore with certificate created like so (in JKS format):
60+
*
61+
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"
62+
*/
63+
SSLServer() throws Exception
64+
{
65+
sslContext = null;
66+
loadFromFile();
67+
68+
// create the web socket server
69+
WebSocketSource wsgateway = new WebSocketSource(8001, InetAddress.getByName("127.0.0.1"));
70+
wsgateway.setWebSocketFactory(this);
71+
wsgateway.start();
72+
}
73+
74+
@Override
75+
public WebSocketImpl createWebSocket( WebSocketAdapter a, Draft d, Socket c ) {
76+
77+
return new WebSocketImpl( a, d, c );
78+
}
79+
80+
@Override
81+
public WebSocketImpl createWebSocket( WebSocketAdapter a, List<Draft> d, Socket s ) {
82+
if(sslContext != null) try{
83+
SSLEngine e = sslContext.createSSLEngine();
84+
e.setUseClientMode(false);
85+
return new WebSocketImpl( a, d, s );
86+
} catch ( Exception e1 ) {
87+
}
88+
return new WebSocketImpl( a, d, s );
89+
}
90+
91+
@Override
92+
public SocketChannel wrapChannel( SocketChannel c ) {
93+
if( sslContext != null )
94+
try {
95+
SSLEngine e = sslContext.createSSLEngine();
96+
e.setUseClientMode( false );
97+
new SSLSocketChannel( c, e );
98+
} catch ( Exception e1 ) {
99+
}
100+
101+
return c;
102+
}
103+
104+
class WebSocketSource extends WebSocketServer
105+
{
106+
private WebSocket handle;
107+
WebSocketSource(int port, InetAddress addr)
108+
{
109+
super(new InetSocketAddress(addr, port));
110+
handle = null;
111+
}
112+
113+
@Override
114+
public void onClose(WebSocket arg0, int arg1, String arg2, boolean arg3)
115+
{
116+
System.err.println("---------------------------->Closed");
117+
if(arg0 == handle) handle = null;
118+
}
119+
120+
@Override
121+
public void onError(WebSocket arg0, Exception arg1) {
122+
// TODO Auto-generated method stub
123+
}
124+
125+
@Override
126+
public void onMessage(WebSocket arg0, String arg1)
127+
{
128+
if(arg0 != handle){
129+
arg0.close(org.java_websocket.framing.CloseFrame.NORMAL);
130+
return;
131+
}
132+
133+
System.out.println("--------->["+arg1+"]");
134+
}
135+
136+
@Override
137+
public void onOpen(WebSocket arg0, ClientHandshake arg1)
138+
{
139+
// nothing to see just yet
140+
if(handle == null){
141+
handle = arg0;
142+
}else if(handle != arg0){
143+
arg0.close(org.java_websocket.framing.CloseFrame.NORMAL);
144+
}
145+
}
146+
147+
void done()
148+
{
149+
if(handle != null) handle.close(org.java_websocket.framing.CloseFrame.NORMAL);
150+
}
151+
}
152+
}
153+
154+
//@formatter:on

‎example/ServerStressTest.java‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import javax.swing.event.ChangeEvent;
2222
import javax.swing.event.ChangeListener;
2323

24-
import org.java_websocket.WebSocketClient;
24+
import org.java_websocket.client.WebSocketClient;
2525

2626
public class ServerStressTest extends JFrame {
2727
private JSlider clients;
@@ -200,7 +200,6 @@ public void send() {
200200
for( WebSocketClient cl : websockets ) {
201201
try {
202202
cl.send( payload );
203-
cl.flush();
204203
} catch ( NotYetConnectedException e ) {
205204
notyetconnected++;
206205
}

0 commit comments

Comments
 (0)