Node.js 和 Android Eclipse 中的 Websocket
Node.js and Websocket in Android Eclipse
感谢您调查我的问题。
我是 android 开发的初学者,目前我正在尝试制作使用套接字和节点 js 的聊天应用程序。
我使用了 github 中的一个库,即 https://github.com/Gottox/socket.io-java-client 并且能够将消息发送到我的服务器并且我能够在 "new_client_message" 下接收回消息,如下所示下面的 logcat 图片。
我面临的问题是我无法找到从服务器获取消息以在列表视图中显示消息的方法。如果有人能帮助我,那就太好了。提前致谢
我的LogCat:
Node.js代码:
var socket = require('socket.io');
var express = require('express');
var http = require('http');
var app = express();
var server = http.createServer(app);
var io = socket.listen(server);
var users = {};
var clients = {};
io.sockets.on( 'connection', function(socket) {
console.log("New client !");
var socket_id = socket.id;
var hs = socket.handshake;
//store user with socket id
if(hs.query.user_id !== undefined){
users[hs.query.user_id] = socket.id; // connected user with its socket.id
}
clients[socket.id] = socket; // add the client data to the hash
socket.on('disconnect', function () {
delete clients[socket.id]; // remove the client from the array
delete users[hs.query.username]; // remove connected user & socket.id
});
socket
.on('new_message', function(data){
clients[users['admin']].emit('new_message', {'original_data':data,'socket_id': socket_id } );
})
.on('new_client_message', function(data){
console.log(data);
clients[data.socket_id].emit('new_client_message', data.message);
})
;
});
server.listen(3030);
这是我的代码:
socket = null;
try {
socket = new SocketIO("http://xxx.xxx.xx.xx:3030/");
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
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");
}
//here I was trying to get the message from the server, convert into string and
//display in list view(thats when the error displayed)
@Override
public void on(String event, IOAcknowledge ack, Object... args) {
System.out.println("Server triggered event '" + event + "'");
System.out.println("senrver ack" + ack);
System.out.println("server said this " + args[0]);
rohan = args[0].toString();
mListData.add(rohan);
//mListData.add(args[0].toString());
}
});
//mListData.add(rohan);
//sending the message from the app when onclick to the server which is sucessful
send.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// This line is cached until the connection is establisched.
//socket.send("new_message");
chat = messag.getText().toString();
karan = client_email+";"+chat;
// This line is cached until the connection is establisched.
socket.emit("new_message", karan);
click();
}
private void click() {
// TODO Auto-generated method stub
//getting the username
name = getIntent().getExtras().getString("name");
String output = name.substring(0,1).toUpperCase() + name.substring(1);
// converting the TextView message to string
msg = messag.getText().toString();
// combining the username and the text view
messag.setText(output +" " + ":" + " " + msg);
//showing the final combination in the listview
mListData.addAll(messag.getText().toString());
messag.setText("");
//when the list view is updated with data, then it goes to that position
lvList.setSelection(mListData.getCount() -1);
post();
}
请指导我应该在哪里添加更多代码以在列表视图中显示来自 node.js 服务器的消息。我确信我犯了一些错误,如果有人能纠正我,我将不胜感激。
非常感谢!
Hy Karan.. 你走对了,伙计。唯一缺少的是一小段代码。这里的错误是您在工作线程中设置了适配器。您只能从主线程更新视图。
您必须将更新 ui 的后台任务部分移动到主线程上。
只需替换代码:
@Override
public void on(String event, IOAcknowledge ack, Object... args)
与:
@Override
public void on(String event, IOAcknowledge ack, Object... args) {
// TODO Auto-generated method stub
if(event.equals("new_client_message")){
Log.v("SocketIO", "new_client_message" + " " + args[0]);
rohan = args[0].toString();
System.out.println("admin" + " : " + " " + rohan);
runOnUiThread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
mListData.add("Admin" + " : " + " " + rohan);
mListData.notifyDataSetChanged();
lvList.setSelection(mListData.getCount() -1);
}
});
}
这里 "new_client_message" 是来自服务器的触发器.. 只需替换为您的。
例如,在您的情况下 "new_message" 是从您的应用程序到服务器的触发器。对不起,不是专业的词,但我希望它会有所帮助。
干杯
感谢您调查我的问题。
我是 android 开发的初学者,目前我正在尝试制作使用套接字和节点 js 的聊天应用程序。
我使用了 github 中的一个库,即 https://github.com/Gottox/socket.io-java-client 并且能够将消息发送到我的服务器并且我能够在 "new_client_message" 下接收回消息,如下所示下面的 logcat 图片。
我面临的问题是我无法找到从服务器获取消息以在列表视图中显示消息的方法。如果有人能帮助我,那就太好了。提前致谢
我的LogCat:
Node.js代码:
var socket = require('socket.io');
var express = require('express');
var http = require('http');
var app = express();
var server = http.createServer(app);
var io = socket.listen(server);
var users = {};
var clients = {};
io.sockets.on( 'connection', function(socket) {
console.log("New client !");
var socket_id = socket.id;
var hs = socket.handshake;
//store user with socket id
if(hs.query.user_id !== undefined){
users[hs.query.user_id] = socket.id; // connected user with its socket.id
}
clients[socket.id] = socket; // add the client data to the hash
socket.on('disconnect', function () {
delete clients[socket.id]; // remove the client from the array
delete users[hs.query.username]; // remove connected user & socket.id
});
socket
.on('new_message', function(data){
clients[users['admin']].emit('new_message', {'original_data':data,'socket_id': socket_id } );
})
.on('new_client_message', function(data){
console.log(data);
clients[data.socket_id].emit('new_client_message', data.message);
})
;
});
server.listen(3030);
这是我的代码:
socket = null;
try {
socket = new SocketIO("http://xxx.xxx.xx.xx:3030/");
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
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");
}
//here I was trying to get the message from the server, convert into string and
//display in list view(thats when the error displayed)
@Override
public void on(String event, IOAcknowledge ack, Object... args) {
System.out.println("Server triggered event '" + event + "'");
System.out.println("senrver ack" + ack);
System.out.println("server said this " + args[0]);
rohan = args[0].toString();
mListData.add(rohan);
//mListData.add(args[0].toString());
}
});
//mListData.add(rohan);
//sending the message from the app when onclick to the server which is sucessful
send.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// This line is cached until the connection is establisched.
//socket.send("new_message");
chat = messag.getText().toString();
karan = client_email+";"+chat;
// This line is cached until the connection is establisched.
socket.emit("new_message", karan);
click();
}
private void click() {
// TODO Auto-generated method stub
//getting the username
name = getIntent().getExtras().getString("name");
String output = name.substring(0,1).toUpperCase() + name.substring(1);
// converting the TextView message to string
msg = messag.getText().toString();
// combining the username and the text view
messag.setText(output +" " + ":" + " " + msg);
//showing the final combination in the listview
mListData.addAll(messag.getText().toString());
messag.setText("");
//when the list view is updated with data, then it goes to that position
lvList.setSelection(mListData.getCount() -1);
post();
}
请指导我应该在哪里添加更多代码以在列表视图中显示来自 node.js 服务器的消息。我确信我犯了一些错误,如果有人能纠正我,我将不胜感激。 非常感谢!
Hy Karan.. 你走对了,伙计。唯一缺少的是一小段代码。这里的错误是您在工作线程中设置了适配器。您只能从主线程更新视图。 您必须将更新 ui 的后台任务部分移动到主线程上。 只需替换代码:
@Override
public void on(String event, IOAcknowledge ack, Object... args)
与:
@Override
public void on(String event, IOAcknowledge ack, Object... args) {
// TODO Auto-generated method stub
if(event.equals("new_client_message")){
Log.v("SocketIO", "new_client_message" + " " + args[0]);
rohan = args[0].toString();
System.out.println("admin" + " : " + " " + rohan);
runOnUiThread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
mListData.add("Admin" + " : " + " " + rohan);
mListData.notifyDataSetChanged();
lvList.setSelection(mListData.getCount() -1);
}
});
}
这里 "new_client_message" 是来自服务器的触发器.. 只需替换为您的。 例如,在您的情况下 "new_message" 是从您的应用程序到服务器的触发器。对不起,不是专业的词,但我希望它会有所帮助。 干杯