diff --git a/.gitignore b/.gitignore index e0c7e85..1df5f8b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ bin/ jar/ .idea BasicExample.class +examples/customid.dat diff --git a/README.markdown b/README.markdown index a489662..51234ca 100644 --- a/README.markdown +++ b/README.markdown @@ -28,14 +28,21 @@ Using socket.io-java-client is quite simple. But lets see: Checkout and compile the project: ``` bash -git clone git://github.com/Gottox/socket.io-java-client.git -cd socket.io-java-client +git clone https://github.com/yunba/yunba-socket.io-java-sdk.git +cd yunba-socket.io-java-sdk ant jar mv jar/socketio.jar /path/to/your/libs/project ``` ### yunba.io socket.io API 例子 +注意在使用前,编辑 `examples/basic/BasicExample.java`,把 APPKEY 换成你自己的。 + +```java +/* 从 yunba.io 获取应用的 appkey */ +private static String APPKEY = "52fcc04c4dc903d66d6f8f92"; +``` + ```bash cd examples javac -cp ../jar/socketio.jar basic/BasicExample.java diff --git a/build.xml b/build.xml index afa2eb6..3a6b45f 100644 --- a/build.xml +++ b/build.xml @@ -18,7 +18,7 @@ - + diff --git a/examples/basic/BasicExample.java b/examples/basic/BasicExample.java index 3651fd2..eddc1b4 100644 --- a/examples/basic/BasicExample.java +++ b/examples/basic/BasicExample.java @@ -18,6 +18,12 @@ import java.lang.Exception; import java.lang.Object; import java.lang.System; +import java.util.List; +import java.nio.charset.Charset; +import java.io.PrintWriter; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.UUID; public class BasicExample implements IOCallback { private SocketIO socket; @@ -91,8 +97,22 @@ public void on(String event, IOAcknowledge ack, Object... args) { public void onSocketConnectAck() throws Exception { System.out.println("onSocketConnectAck"); - // emit connect - socket.emit("connect", new JSONObject("{'appkey': '" + APPKEY + "'}")); + String customId = ""; + try { + List file = java.nio.file.Files.readAllLines(Paths.get("customid.dat"), Charset.defaultCharset()); + customId = file.get(0); + } catch (Exception e) { + customId = UUID.randomUUID().toString(); + } + + // emit connect + socket.emit("connect", new JSONObject("{'appkey': '" + APPKEY + "', 'customid': '" + customId + "'}")); + + try { + PrintWriter writer = new PrintWriter("customid.dat", Charset.defaultCharset().name()); + writer.println(customId); + writer.close(); + } catch (Exception e) {} } public void onConnAck(JSONObject json) throws Exception { diff --git a/examples/customid.dat b/examples/customid.dat new file mode 100644 index 0000000..67f5174 --- /dev/null +++ b/examples/customid.dat @@ -0,0 +1 @@ +8683f3a6-c092-4d2b-9f85-395fc5432c40 diff --git a/libs/WebSocket.jar b/libs/WebSocket.jar deleted file mode 100644 index ef36379..0000000 Binary files a/libs/WebSocket.jar and /dev/null differ diff --git a/libs/java_websocket.jar b/libs/java_websocket.jar new file mode 100644 index 0000000..2cae642 Binary files /dev/null and b/libs/java_websocket.jar differ diff --git a/src/io/socket/IOConnection.java b/src/io/socket/IOConnection.java index 0febf78..f15980d 100644 --- a/src/io/socket/IOConnection.java +++ b/src/io/socket/IOConnection.java @@ -169,6 +169,7 @@ private class ReconnectTask extends TimerTask { */ @Override public void run() { + handshake(); connectTransport(); if (!keepAliveInQueue) { sendPlain("2::"); @@ -293,6 +294,7 @@ private void handshake() { URL url; String response; URLConnection connection; + int oldState = IOConnection.this.getState(); try { setState(STATE_HANDSHAKE); url = new URL(IOConnection.this.url.toString() + SOCKET_IO_1); @@ -319,7 +321,8 @@ private void handshake() { closingTimeout = Long.parseLong(data[2]) * 1000; protocols = Arrays.asList(data[3].split(",")); } catch (Exception e) { - error(new SocketIOException("Error while handshaking", e)); + if (oldState == STATE_INIT) + error(new SocketIOException("Error while handshaking", e)); } } @@ -331,7 +334,11 @@ private synchronized void connectTransport() { return; setState(STATE_CONNECTING); if (protocols.contains(WebsocketTransport.TRANSPORT_NAME)) - transport = WebsocketTransport.create(url, this); + try { + transport = WebsocketTransport.create(url, this); + } catch (IOException exception) { + error(new SocketIOException("Error while connect", exception)); + } else if (protocols.contains(XhrTransport.TRANSPORT_NAME)) transport = XhrTransport.create(url, this); else { diff --git a/src/io/socket/WebsocketTransport.java b/src/io/socket/WebsocketTransport.java index 0ec9bee..de0faf7 100644 --- a/src/io/socket/WebsocketTransport.java +++ b/src/io/socket/WebsocketTransport.java @@ -8,7 +8,7 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; -import org.java_websocket.client.DefaultSSLWebSocketClientFactory; +// import org.java_websocket.client.DefaultSSLWebSocketClientFactory; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; @@ -16,7 +16,8 @@ class WebsocketTransport extends WebSocketClient implements IOTransport { private final static Pattern PATTERN_HTTP = Pattern.compile("^http"); public static final String TRANSPORT_NAME = "websocket"; private IOConnection connection; - public static IOTransport create(URL url, IOConnection connection) { + + public static IOTransport create(URL url, IOConnection connection) throws IOException { URI uri = URI.create( PATTERN_HTTP.matcher(url.toString()).replaceFirst("ws") + IOConnection.SOCKET_IO_1 + TRANSPORT_NAME @@ -25,12 +26,14 @@ public static IOTransport create(URL url, IOConnection connection) { return new WebsocketTransport(uri, connection); } - public WebsocketTransport(URI uri, IOConnection connection) { + public WebsocketTransport(URI uri, IOConnection connection) throws IOException { super(uri); this.connection = connection; SSLContext context = IOConnection.getSslContext(); if("wss".equals(uri.getScheme()) && context != null) { - this.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(context)); + SSLSocketFactory defaultSSLSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); + this.setSocket(defaultSSLSocketFactory.createSocket()); + // this.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(context)); } }