【问题标题】:How to connect Android Client with Node.js server using SocketIO?如何使用 SocketIO 将 Android 客户端与 Node.js 服务器连接?
【发布时间】:2014-12-07 10:10:11
【问题描述】:

我正在尝试使用 SocketIO 从 Android 客户端连接 Node.js,但我在 Logcat 中遇到 SocketTimeOutException。

我的代码:

MainActivity.java

package com.example.androidtestclient;

import io.socket.IOAcknowledge;
import io.socket.IOCallback;
import io.socket.SocketIO;
import io.socket.SocketIOException;

import java.net.MalformedURLException;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

try {
    SocketIO socket = new SocketIO("http://10.42.0.32:3000/");


    socket.connect(new IOCallback() {
        @Override
        public void onMessage(JSONObject json, IOAcknowledge ack) {
            try {
                System.out.println("Server said:" + json.toString(2));
                // display("Connectet  and " + json.toString(2));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onMessage(String data, IOAcknowledge ack) {
            System.out.println("Server said: " + data);
            // display("Connectet  and " + data);
        }

        @Override
        public void onError(SocketIOException socketIOException) {
            System.out.println("an Error occured");
            Log.d("error", "an error occured");
            // display("not Connectet == error occured ");
            socketIOException.printStackTrace();
        }

        @Override
        public void onDisconnect() {
            System.out.println("Connection terminated.");
            Log.e("disconnect", "Connection terminated");
            // display("disConnectet ");
        }

        @Override
        public void onConnect() {
            System.out.println("Connection established");
            Log.v("connect", "Connection established");
            // display("Connectet  and done");
        }

        @Override
        public void on(String event, IOAcknowledge ack, Object... args) {
            System.out
                    .println("Server triggered event '" + event + "'");
            Log.v("ON", "Server triggered event '" + event + "'");
            // display("Connectet  and " + event);
        }
    });

    // This line is cached until the connection is establisched.
    socket.send("Hello Server!");
} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

} }

Node.js 代码

var http = require('http');
var io   = require('socket.io');
var app = http.createServer();

app.listen(3000);

console.log('Server running at http://127.0.0.1:3000/');

例外:

12-07 15:28:53.396: W/System.err(4141): io.socket.SocketIOException: Error while handshaking
12-07 15:28:53.396: W/System.err(4141):     at io.socket.IOConnection.handshake(IOConnection.java:322)
12-07 15:28:53.396: W/System.err(4141):     at io.socket.IOConnection.access$7(IOConnection.java:292)
12-07 15:28:53.396: W/System.err(4141):     at io.socket.IOConnection$ConnectThread.run(IOConnection.java:199)
12-07 15:28:53.396: W/System.err(4141): Caused by: java.net.SocketTimeoutException
12-07 15:28:53.396: W/System.err(4141):     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:491)
12-07 15:28:53.396: W/System.err(4141):     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
12-07 15:28:53.396: W/System.err(4141):     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
12-07 15:28:53.396: W/System.err(4141):     at java.io.InputStream.read(InputStream.java:163)
12-07 15:28:53.396: W/System.err(4141):     at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142)
12-07 15:28:53.396: W/System.err(4141):     at java.io.BufferedInputStream.read(BufferedInputStream.java:227)
12-07 15:28:53.396: W/System.err(4141):     at libcore.io.Streams.readAsciiLine(Streams.java:201)
12-07 15:28:53.396: W/System.err(4141):     at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:547)
12-07 15:28:53.396: W/System.err(4141):     at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:787)
12-07 15:28:53.396: W/System.err(4141):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
12-07 15:28:53.396: W/System.err(4141):     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
12-07 15:28:53.396: W/System.err(4141):     at io.socket.IOConnection.handshake(IOConnection.java:313)
12-07 15:28:53.396: W/System.err(4141):     ... 2 more

在浏览器中,我可以与 localhost:3000 连接,但在 Android 客户端中遇到问题。我还在应用程序中提供了我的系统 IP 地址。

请给我一些解决方案,请告诉我。

【问题讨论】:

  • SocketIO 不喜欢其他服务使用它,握手的错误意味着它意识到你没有使用SocketIO。如果你是那么这很有趣

标签: android node.js socket.io


【解决方案1】:

问题是您的客户端不支持 socket.io v1.0.x,而您在服务器端使用的是 socket.io v1.0。您应该降级服务器上的 socket.io 版本或更改您的库并使用另一个支持 v1 的库 如果你使用的是 android studio,你可以使用this 但如果你使用的是 eclipse,我不知道有任何库支持 socket.io v1

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多