Android Eclipse中的Node.js和Websocket

感谢您查看我的问题。

我是android开发的初学者,目前我正在尝试使用socket和node js制作聊天应用程序。

我使用了来自github的库,即https://github.com/Gottox/socket.io-java-client,并且能够向我的服务器发送消息,并且我能够在“new_client_message”下收到回复消息。在下面的logcat图片中。

我面临的问题是,我无法弄清楚从服务器获取消息以在列表视图中显示它的方法。 如果有人能帮助我,那将是很棒的。 提前致谢

我的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(); } 

请指导我在哪里添加更多代码以从listview中的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”是从您的应用程序到服务器的触发器。 很抱歉没有专业的话,但我希望它会有所帮助。 干杯