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..4aca3f7 100644 --- a/src/com/codebutler/android_websockets/HybiParser.java +++ b/src/com/codebutler/android_websockets/HybiParser.java @@ -240,13 +240,17 @@ 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) { if (mClosed) return; - mClient.send(frame(reason, OP_CLOSE, code)); + mClient.sendFrame(frame(reason, OP_CLOSE, code)); mClosed = true; } diff --git a/src/com/codebutler/android_websockets/WebSocketClient.java b/src/com/codebutler/android_websockets/WebSocketClient.java index 7e3343c..2cc118f 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"); @@ -164,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;