【问题标题】:Why java socket.io emit is fail为什么 java socket.io 发射失败
【发布时间】:2016-10-04 16:06:51
【问题描述】:

我正在使用 Socket.io 和 node.js 服务器创建 android 应用程序。

我的 js 服务器:

 var http = require('http');

var server = http.createServer(function(req, res) {
});

var mysql = require('mysql');

var db = mysql.createConnection({
    host:,
    port:,
    user:,
    password:,
    database:
});

var resultconnection = "";

db.connect(function(err){
    if (err) {
    resultconnection = err;
    }
});

var io = require('socket.io').listen(server);

io.on('connection',function(socket){
   console.log('Connected!');

    socket.on("createaccount", function(data){
        console.log('Create account executed.');
        if(resultconnection != ""){
            db.query("INSERT INTO USER (USERNAME, PASSWORD, EMAIL, BIRTHDATE) VALUES('"+data["username"]+"', SHA1('"+data["password"]+"'), '"+data["email"]+"', "+data["birthdate"]+"')");
            resultconnection = "OK";
        }
        socket.emit('response', {"response": resultconnection});
    });


});

server.listen(8080);

Android 客户端(java):

try {
            socket = IO.socket("http://localhost:8080");
            socket.on("response", new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    JSONObject obj = (JSONObject) args[0];
                    try {
                        result = obj.getString("message");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

            });
            socket.connect();
            JSONObject createUser = new JSONObject();
            try {
                createUser.put("username", username);
                createUser.put("password", password);
                createUser.put("email", email);
                createUser.put("birthdate", datanasc);
            } catch (JSONException e) {
                e.printStackTrace();
            }

            socket.emit("createaccount", "");
        } catch (URISyntaxException e) {
            result = e.getMessage();
        }

Console.log("Connected") 正在运行,但是当我运行 socket.emit("createaccount") 时,客户端没有在服务器上运行。

【问题讨论】:

  • 你是在模拟器还是真机上测试App?

标签: java android node.js websocket socket.io


【解决方案1】:

我认为您在客户端代码中提供的服务器 IP 不正确。当您的服务器在其他远程系统上运行时,它正在尝试连接到您的 Android 设备的本地主机。 尝试在以下 sn-p 中更改服务器 IP(理想情况下,这应该不是 localhost):

try {
        socket = IO.socket("<server_IP:server_PORT");
        socket.on("response", new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                JSONObject obj = (JSONObject) args[0];
                try {
                    result = obj.getString("message");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

        });
        socket.connect();
        JSONObject createUser = new JSONObject();
        try {
            createUser.put("username", username);
            createUser.put("password", password);
            createUser.put("email", email);
            createUser.put("birthdate", datanasc);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        socket.emit("createaccount", "");
    } catch (URISyntaxException e) {
        result = e.getMessage();
    }

【讨论】:

    【解决方案2】:

    服务器的设计方式存在严重的结构性问题:

    1. 您正在尝试将resultconnection 保存在全局模块中。这意味着您只能拥有一个可以正常工作的 socket.io 客户端连接。第二个连接将看到来自前一个客户端连接的resultconnection。这绝不是一种正确的做事方式。如果您从来没有超过一个客户端连接到您的服务器,它可能会起作用 - 不仅一次只有一个客户端,而是始终只有一个客户端。

    2. 您在 createaccount 消息处理程序中处理异步数据库操作的方式是错误的。您正在尝试将.emit() resultconnection 在设置之前返回给客户端。

    3. 您对db.connect() 调用的错误处理似乎不正确。当您无法连接到数据库时,您需要采取一些措施,而不仅仅是这样设置变量并继续进行,就好像没有任何问题一样。即使您设置的那个变量后来也被错误地使用了。您正在检查连接是否有错误,如果有,那么您正在尝试执行数据库操作。除了设计混乱之外,这种逻辑甚至是倒退的。

    要考虑如何解决第一个问题,您需要解释您要使用此语句执行的操作:

     if(resultconnection != ""){
    

    因为这需要以不同的方式完成。您不能只在服务器中保存全局状态并期望它代表任何传入连接的状态。

    如何解决第二个问题将取决于对第一个问题做了什么。

    如何解决第三个问题涉及一些设计决策,即当您无法连接到数据库时如何处理服务器(关闭、重试、记录等...)。

    【讨论】:

    • 我理解变量的部分确实是错误的。但是我在这个检查之前放置这个事件的console.log,它没有被执行。我发现连接已经建立和丢失,我如何保持连接的客户端?
    • @MillerDominguês - 我不明白你在上一条评论中要问什么。
    • 在客户端我运行socket.connect(),服务器打印console.log("connected!"),但是使用socket.emit("createaccount")时,服务器不打印console.log('Create account executed.'),这在 IF 之前。
    • @MillerDominguês - 这听起来就像您在上述问题之前的第一个问题是您的客户端没有与您的服务器连接。我不了解 Android,所以无法为您提供 Android 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2012-05-11
    • 2016-09-01
    • 2014-11-17
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多