我正在使用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(“已连接”)正在运行,但是当我运行socket.emit(“createaccount”)时,客户端无法在服务器上运行。
答案 0 :(得分:0)
我认为您在客户端代码中提供的服务器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 :(得分:0)
您的服务器设计存在重大结构性问题:
您正在尝试将resultconnection
保存在全局模块中。这意味着您只能拥有一个能正常工作的socket.io客户端连接。第二个连接将看到先前客户端连接中的resultconnection
。这绝不是一种正确的做事方式。如果你从来没有多个客户端连接到你的服务器 - 它不是一次只有一个客户端,而是一次只有一个客户端,它可能会工作。
在createaccount消息处理程序中处理异步数据库操作的方式是错误的。在设置之前,您正试图.emit()
resultconnection
返回客户端。
您对db.connect()
电话的错误处理似乎不正确。当您无法连接到数据库时,您需要采取一些操作,而不仅仅是设置一个变量并继续进行,就像没有任何错误一样。即使您设置的变量以后也会被错误地使用。您正在检查连接上是否有错误,如果您有错误,那么您正在尝试进行数据库操作。除了一个混乱的设计,这个逻辑甚至倒退。
要考虑如何解决第一个问题,您需要解释您要对此声明做些什么:
if(resultconnection != ""){
因为这需要以不同的方式完成。您不能只在服务器中保存全局状态,并期望它代表任何传入连接的状态。
如何解决第二个问题将取决于对第一个问题所做的工作。
如何修复第三个问题涉及一些设计决定,当您无法连接到数据库时,如何处理服务器(关闭,重试,记录等等)。