示例#1
0
  public void connect() {
    if (mThread != null && mThread.isAlive()) {
      return;
    }

    mThread =
        new Thread(
            new Runnable() {
              @Override
              public void run() {
                try {
                  int port =
                      (mURI.getPort() != -1)
                          ? mURI.getPort()
                          : ((mURI.getScheme().equals("wss") || mURI.getScheme().equals("https"))
                              ? 443
                              : 80);

                  String path = TextUtils.isEmpty(mURI.getPath()) ? "/" : mURI.getPath();
                  if (!TextUtils.isEmpty(mURI.getQuery())) {
                    path += "?" + mURI.getQuery();
                  }

                  String originScheme = mURI.getScheme().equals("wss") ? "https" : "http";
                  URI origin = new URI(originScheme, "//" + mURI.getHost(), null);

                  SocketFactory factory =
                      (mURI.getScheme().equals("wss") || mURI.getScheme().equals("https"))
                          ? getSSLSocketFactory()
                          : SocketFactory.getDefault();
                  mSocket = factory.createSocket(mURI.getHost(), port);

                  PrintWriter out = new PrintWriter(mSocket.getOutputStream());
                  out.print("GET " + path + " HTTP/1.1\r\n");
                  out.print("Upgrade: websocket\r\n");
                  out.print("Connection: Upgrade\r\n");
                  out.print("Host: " + mURI.getHost() + "\r\n");
                  out.print("Origin: " + origin.toString() + "\r\n");
                  out.print("Sec-WebSocket-Key: " + createSecret() + "\r\n");
                  out.print("Sec-WebSocket-Version: 13\r\n");
                  if (mExtraHeaders != null) {
                    for (NameValuePair pair : mExtraHeaders) {
                      out.print(String.format("%s: %s\r\n", pair.getName(), pair.getValue()));
                    }
                  }
                  out.print("\r\n");
                  out.flush();

                  HybiParser.HappyDataInputStream stream =
                      new HybiParser.HappyDataInputStream(mSocket.getInputStream());

                  // Read HTTP response status line.
                  StatusLine statusLine = parseStatusLine(readLine(stream));
                  if (statusLine == null) {
                    throw new HttpException("Received no reply from server.");
                  } else if (statusLine.getStatusCode() != HttpStatus.SC_SWITCHING_PROTOCOLS) {
                    throw new HttpResponseException(
                        statusLine.getStatusCode(), statusLine.getReasonPhrase());
                  }

                  // Read HTTP response headers.
                  String line;
                  while (!TextUtils.isEmpty(line = readLine(stream))) {
                    Header header = parseHeader(line);
                    if (header.getName().equals("Sec-WebSocket-Accept")) {
                      // FIXME: Verify the response...
                    }
                  }
                  mConnected = true;
                  mListener.onConnect();
                  // Now decode websocket frames.
                  mParser.start(stream);

                } catch (EOFException ex) {
                  mListener.onDisconnect(0, "EOF");
                  mConnected = false;

                } catch (SSLException ex) {
                  // Connection reset by peer
                  mConnected = false;
                  mListener.onDisconnect(0, "SSL");

                } catch (Exception ex) {
                  mListener.onError(ex);
                }
              }
            });
    mThread.start();
  }