繁体   English   中英

为什么Java socket.io发出失败

[英]Why java socket.io emit is fail

我正在用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”)时,客户端不会在服务器上运行。

我认为您在客户端代码中提供的服务器IP不正确。 当服务器在其他远程系统上运行时,它正在尝试连接到Android设备的本地主机。 尝试在以下代码段中更改服务器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();
    }

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

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

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

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

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

 if(resultconnection != ""){

因为这将需要以不同的方式进行。 您不仅可以将全局状态保存在服务器中,而且不能期望它代表任何传入连接的状态。

如何解决第二个问题将取决于对第一个问题所做的工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM