From d38c98a5b89bacaddce8eb045010c02ae3213f36 Mon Sep 17 00:00:00 2001 From: Brad LaFountain Date: Wed, 13 Feb 2013 17:04:14 -0500 Subject: [PATCH 1/3] added time out to websocketclient --- .../android_websockets/WebSocketClient.java | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/src/com/codebutler/android_websockets/WebSocketClient.java b/src/com/codebutler/android_websockets/WebSocketClient.java index 7e3343c..54733ab 100644 --- a/src/com/codebutler/android_websockets/WebSocketClient.java +++ b/src/com/codebutler/android_websockets/WebSocketClient.java @@ -1,30 +1,37 @@ package com.codebutler.android_websockets; -import android.os.Handler; -import android.os.HandlerThread; -import android.text.TextUtils; -import android.util.Base64; -import android.util.Log; -import org.apache.http.*; -import org.apache.http.client.HttpResponseException; -import org.apache.http.message.BasicLineParser; -import org.apache.http.message.BasicNameValuePair; - -import javax.net.SocketFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLException; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; import java.io.EOFException; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; +import java.net.InetSocketAddress; import java.net.Socket; import java.net.URI; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.List; +import javax.net.SocketFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + +import org.apache.http.Header; +import org.apache.http.HttpException; +import org.apache.http.HttpStatus; +import org.apache.http.NameValuePair; +import org.apache.http.StatusLine; +import org.apache.http.client.HttpResponseException; +import org.apache.http.message.BasicLineParser; +import org.apache.http.message.BasicNameValuePair; + +import android.os.Handler; +import android.os.HandlerThread; +import android.text.TextUtils; +import android.util.Base64; +import android.util.Log; + public class WebSocketClient { private static final String TAG = "WebSocketClient"; @@ -35,6 +42,7 @@ public class WebSocketClient { private HandlerThread mHandlerThread; private Handler mHandler; private List mExtraHeaders; + private int mTimeout; private HybiParser mParser; private final Object mSendLock = new Object(); @@ -46,9 +54,14 @@ public static void setTrustManagers(TrustManager[] tm) { } public WebSocketClient(URI uri, Listener listener, List extraHeaders) { + this(uri, listener, extraHeaders, -1); + } + + public WebSocketClient(URI uri, Listener listener, List extraHeaders, int timeout) { mURI = uri; mListener = listener; mExtraHeaders = extraHeaders; + mTimeout = timeout; mParser = new HybiParser(this); mHandlerThread = new HandlerThread("websocket-thread"); @@ -80,8 +93,15 @@ public void run() { URI origin = new URI(originScheme, "//" + mURI.getHost(), null); SocketFactory factory = mURI.getScheme().equals("wss") ? getSSLSocketFactory() : SocketFactory.getDefault(); - mSocket = factory.createSocket(mURI.getHost(), port); - + mSocket = factory.createSocket(); + + InetSocketAddress socketAddress = new InetSocketAddress(mURI.getHost(), port); + if(mTimeout != -1) { + mSocket.connect(socketAddress, mTimeout); + } else { + mSocket.connect(socketAddress); + } + PrintWriter out = new PrintWriter(mSocket.getOutputStream()); out.print("GET " + path + " HTTP/1.1\r\n"); out.print("Upgrade: websocket\r\n"); From 45fd58756bd806144ba6706bf12ca3770bda3068 Mon Sep 17 00:00:00 2001 From: David Andrade Date: Thu, 19 Sep 2013 14:41:17 -0400 Subject: [PATCH 2/3] Fix ping issue where it reframed ping message. --- .gitignore | 9 ++++++++- src/com/codebutler/android_websockets/HybiParser.java | 6 +++++- .../codebutler/android_websockets/WebSocketClient.java | 8 ++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 81d81b4..71beb48 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,9 @@ -gen/ +#Android generated +bin +gen +.project +.classpath +.settings + +#Command line local.properties diff --git a/src/com/codebutler/android_websockets/HybiParser.java b/src/com/codebutler/android_websockets/HybiParser.java index fed76b8..c608f05 100644 --- a/src/com/codebutler/android_websockets/HybiParser.java +++ b/src/com/codebutler/android_websockets/HybiParser.java @@ -240,8 +240,12 @@ private byte[] frame(Object data, int opcode, int errorCode) { return frame; } + public void ping() { + mClient.sendFrame(frame(new byte[]{}, OP_PING, -1)); + } + public void ping(String message) { - mClient.send(frame(message, OP_PING, -1)); + mClient.sendFrame(frame(message, OP_PING, -1)); } public void close(int code, String reason) { diff --git a/src/com/codebutler/android_websockets/WebSocketClient.java b/src/com/codebutler/android_websockets/WebSocketClient.java index 54733ab..2cc118f 100644 --- a/src/com/codebutler/android_websockets/WebSocketClient.java +++ b/src/com/codebutler/android_websockets/WebSocketClient.java @@ -184,6 +184,14 @@ public void send(byte[] data) { sendFrame(mParser.frame(data)); } + public void ping() { + mParser.ping(); + } + + public void ping(String message) { + mParser.ping(message); + } + private StatusLine parseStatusLine(String line) { if (TextUtils.isEmpty(line)) { return null; From 010f3dd4f8deb34aeaf2102a0738e080deb992ca Mon Sep 17 00:00:00 2001 From: David Andrade Date: Thu, 19 Sep 2013 14:52:18 -0400 Subject: [PATCH 3/3] Fix issue where it reframed close message. --- src/com/codebutler/android_websockets/HybiParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/codebutler/android_websockets/HybiParser.java b/src/com/codebutler/android_websockets/HybiParser.java index c608f05..4aca3f7 100644 --- a/src/com/codebutler/android_websockets/HybiParser.java +++ b/src/com/codebutler/android_websockets/HybiParser.java @@ -250,7 +250,7 @@ public void ping(String message) { public void close(int code, String reason) { if (mClosed) return; - mClient.send(frame(reason, OP_CLOSE, code)); + mClient.sendFrame(frame(reason, OP_CLOSE, code)); mClosed = true; }