Android使用socket.io实现即时通讯

juzi2年前技术1639

WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯。而Socket.IO是一个完全由JavaScript实现、基于Node.js、支持WebSocket的协议用于实时通信、跨平台的开源框架。


本文将根据 socket.io 官方提供的 socket.io-android-chat Demo 来讲解 socket.io 在android客户端实现即时通讯的一些基本操作。


附上github链接:


Java支持库 socket.io-client-java

Android聊天 Demo socket.io-android-chat

Demo实现了以下功能:


基本文字聊天功能

每个用户加入或者离开时发送通知

用户开始输入信息时发送输入状态的通知

添加依赖

第一步,添加依赖到 build.gradle,如下 :


compile ('io.socket:socket.io-client:0.8.3') {
  // excluding org.json which is provided by Android
  exclude group: 'org.json', module: 'json'
}


第二步,在 AndroidManifest.xml 中注册联网权限


<!-- app/AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>


现在我们可以在项目中使用socket.IO了~


初始化Socket

我们可以通过 IO.socket(“URL”) 方法来获取一个 Socket 实例,其中 “URL” 为服务器地址。

Socket mSocket = IO.socket("http://chat.socket.io");

获取到 Socket 实例后,调用 connect() 方法即可与服务器建立连接。

mSocket.connect();


完整初始化代码如下:


import com.github.nkzawa.socketio.client.IO;
import com.github.nkzawa.socketio.client.Socket;
private Socket mSocket;
{
    try {
        //1.初始化socket.io,设置链接
        mSocket = IO.socket("http://chat.socket.io");
    } catch (URISyntaxException e) {}
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //2.建立socket.io服务器的连接
    mSocket.connect();
}

传输数据

我们可以通过 mSocket.emit(“KEY”, “VALUE”) 的方法来向服务器发送消息,”KEY”为事件的键, “VALUE”为事件的值,值支持任意类型的数据。


对服务器发送一个”new message”事件,其值为”hi~”:

mSocket.emit("new message", "hi~");

private EditText mInputMessageView;
//发送消息的方法
private void attemptSend() {
    String message = mInputMessageView.getText().toString().trim();
    if (TextUtils.isEmpty(message)) {
        return;
    }
    mInputMessageView.setText("");
    mSocket.emit("new message", message);
}


监听事件

Socket.IO 是双向传递信息的 ,这意味着我们可以随时向服务器发送事件,也可以随时响应服务器返回来的事件。


我们可以通过 mSocket.on(“KEY”, LISTENER) 方法来监听服务器返回的事件。其中 “KEY” 为事件的键, LISTENER 为监听器,监听器的类型为 Emitter.Listener() 。

mSocket.on("new message", onNewMessage);

以下为一个监听 new message 事件的示例:


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //使用 onNewMessage 来监听服务器发来的 "new message" 事件
    mSocket.on("new message", onNewMessage);
    mSocket.connect();
}
private Emitter.Listener onNewMessage = new Emitter.Listener() {
    @Override
    public void call(final Object.. args) {
        //主线程调用
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                JSONObject data = (JSONObject) args[0];
                String username;
                String message;
                try {
                    username = data.getString("username");
                    message = data.getString("message");
                } catch (JSONException e) {
                    return;
                }
                // add the message to view
                addMessage(username, message);
            }
        });
    }
};

Emitter.Listener() 接口在 call 方法返回服务器传来的数据,需要注意的是,call方法是在子线程中执行的,如果我们需要在call方法中更新UI,则需使用 handler 或者 runOnUiThread 将操作放到主线程中来执行。


释放资源

为避免内存泄漏等问题。 我们在socket使用完毕的时候,需要断开socket与服务器的连接,并且释放socket的监听事件。


断开服务器连接(disconnect):

mSocket.disconnect();

调用 off 方法释放监听事件:

mSocket.off("new message", onNewMessage);

在Activity结束时,释放socket:

@Override
public void onDestroy() {
    super.onDestroy();
    mSocket.disconnect();
    mSocket.off("new message", onNewMessage);
}

————————————————

版权声明:本文为CSDN博主「Supcoder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/l_lhc/article/details/68950278


相关文章

php实现等比例压缩图片

/**      * desription 压缩图片      * ...

Python Selenium库的使用

(一)Selenium基础入门教程:Selenium官网教程1.Selenium简介Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主...

svn重启操作

a.启动SVN svnserve -d -r /A/B/svn/1.   其中 -d 表示守护进程, -r 表示在后台执行   /A/B/svn/ 为...

git 如何创建新分支

0、首先进入本地git仓库目录下,打开git bash环境:1、使用git branch命令可以查看到,当前目录下有一个master分支和new分支2、使用git branch 分支名称创建分支,创建...

composer安装及配置(Windows)

下载地址:https://getcomposer.org/download/他会自动找到你的php目录,如果没有记得手动修改一直点下一步,即可。如果安装不成功,可能是之前安装过composer没有卸载...

mysql中mysql-bin.000001是什么文件可以删除吗

用ports安装了mysql以后,过一段时间发现/var空间不足了,查一下,会发现是mysql-bin.000001、mysql-bin.000002等文件占用了空间,那么这些文件是干吗的?这是数据库...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。