Android Eclipse 中的 Node.js 和 Websocket [英] Node.js and Websocket in Android Eclipse

查看:14
本文介绍了Android Eclipse 中的 Node.js 和 Websocket的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

感谢您调查我的问题.

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

I am a beginner in android development and currently i am trying to make chat app which uses socket and node js.

我使用了来自 github 的库,即 https://github.com/Gottox/socket.io-java-client 并且能够向我的服务器发送消息,我也能够在new_client_message"下接收回消息,如下面的 logcat 图像所示.

I used a library from github i.e https://github.com/Gottox/socket.io-java-client and was able to send message to my server and i was able to receive back message as well under "new_client_message" which is shown in the logcat image below.

我面临的问题是我无法找出从服务器获取消息以将其显示在列表视图中的方法.如果有人可以帮助我,那就太好了.提前致谢

The problem i am facing is that i cannot figure out the way to get the messages from the server to display it in a list view. It would be great if anyone could help me out. Thanks in advance

我的 LogCat:

Node.js 代码:

Node.js Code:

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 服务器的消息.我确信我犯了一些错误,如果有人能纠正我,我将不胜感激.非常感谢!

Please guide me where should i add further code to diplay the message from the node.js server in the listview. I am sure that i am making some mistake and i would appreciate if someone could correct me. Much thanks !

推荐答案

Hy Karan.. 你走对了,伙计.唯一缺少的是一小段代码.这里的错误是您在工作线程中设置了适配器.您只能从主线程更新视图.您必须将更新 ui 的后台任务部分移动到主线程上.只需将代码替换为:

Hy Karan.. you are going in the right way mate. The only thing that is missing is the small snippet of code. Error here is that you set adapter in working thread. You can update views only from main thread. You have to move the portion of the background task that updates the ui onto the main thread. Just replace the code on:

@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"是从您的应用程序到服务器的触发器.对不起,不是专业的词,但我希望它会有所帮助.干杯

here "new_client_message" is trigger from the server.. just replace with yours. For example in you case "new_message" is the trigger from your app to the server. Sorry for not a professional word but i hope it will help. Cheers

这篇关于Android Eclipse 中的 Node.js 和 Websocket的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆