【问题标题】:Successfully run Socket.IO Android Project with NodeJS使用 NodeJS 成功运行 Socket.IO Android 项目
【发布时间】:2025-12-09 18:40:02
【问题描述】:

我已经设法编译了一个 Socket.IO/Android 项目,现在我正试图让它与 NodeJS 服务器上的 Socket.IO 通信。我将项目放在我的 Drop Box 上:

https://dl.dropboxusercontent.com/u/86164338/socketIOAndroid.zip

一切都编译并运行,但我没有看到 NodeJS 的输出。

这是基于: https://github.com/Gottox/socket.io-java-client

注意这里有编译Java代码并将jar文件复制到libs文件夹的说明:

git clone git://github.com/Gottox/socket.io-java-client.git
cd socket.io-java-client
ant jar mv jar/socketio.jar
/path/to/your/libs/project

非常感谢任何帮助。

Java 代码:

package com.depictlabs.testsockets03;

import java.net.MalformedURLException;
import java.net.URI;

import org.json.JSONObject;


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

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

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

public class MainActivity extends Activity {

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

        SocketIO socket;

        try{
            System.out.println("Initializing Connection.");

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

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

                        @Override
                        public void onError(SocketIOException socketIOException) {
                            System.out.println("an Error occured");
                            socketIOException.printStackTrace();
                        }

                        @Override
                        public void onDisconnect() {
                            System.out.println("Connection terminated.");
                        }

                        @Override
                        public void onConnect() {
                         System.out.println("Connection established");
                        }

                        @Override
                        public void on(String event, IOAcknowledge ack, Object... args) {
                            System.out.println("Server triggered event '" + event + "'");
                        }
                    }
                );

            try {
                // This line is cached until the connection is established.
                System.out.println("Sending message to server.");
                socket.send("user message");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

NodeJS 代码:

var http = require('http')
, io   = require('socket.io');

var app = http.createServer();
app.listen(3000);

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

// Socket.IO server
var io = io.listen(app)
, nicknames = {};

io.sockets.on('connection', function (socket) {
    socket.on('user message', function (msg) {
        console.log('Server running at http://127.0.0.1:3000/');
        socket.broadcast.emit('user message', {user: socket.nickname, message: msg.message});
    });

    socket.on('nickname', function (nick, fn) {
        console.log('Server running at http://127.0.0.1:3000/');
        nickname = nick.nickname;
        if (nicknames[nickname]) {
            fn(true);
        } else {
            fn(false);
            nicknames[nickname] = socket.nickname = nickname;
            socket.broadcast.emit('announcement', {user: nickname, action: 'connected'});
            io.sockets.emit('nicknames', nicknames);
        }
    });

    socket.on('disconnect', function () {
        console.log('Server running at http://127.0.0.1:3000/');
        if (!socket.nickname) return;

        delete nicknames[socket.nickname];
        socket.broadcast.emit('announcement', {user: socket.nickname, action: 'disconected'});
        socket.broadcast.emit('nicknames', nicknames);
    });
});

【问题讨论】:

  • 下载、设置和解决你的错误真的很痛苦。请从下次发布本地化问题..
  • 抱歉,不知道您所说的“本地化”是什么意思。我试图通过提供下载和代码来简化它。
  • 顺便说一句,它似乎不适用于模拟器。我没有在设备上尝试过,因为我手边没有。谢谢!
  • 我正在调查它.. 等等:)
  • 我认为您的 node.js 服务器没有正确编写。你测试过吗?

标签: android node.js socket.io


【解决方案1】:

你的问题是 node.js 服务器运行在本地主机上,任何设备或模拟器运行在虚拟机上,所以,永远不要听你电脑的本地主机。您需要更改网址

socket = new SocketIO("http://localhost:3000/");

对于

您的机器在网络环境中的公共或静态 IP,例如:

socket = new SocketIO("http://192.168.1.23:3000/");

最好的。 C

【讨论】:

  • 模拟器可能是问题?此 URL 在模拟器的 Web 浏览器上运行良好。