Android实现即时聊天

前言:本篇文章将介绍如何实现安卓软件用户之间的即时聊天。

1、选用WebSocket

websocket的介绍

WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455,后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
简单来说,WebSocket可以双向连接,服务器可以主动推送消息到客户端。当客户端与服务器建立连接,其他客户端也与服务器建立连接,那么此时服务器就可以为这两个客户端建立连接,这两个客户端就可以即时通信。
当然,这并不是真正的建立连接,两个客户端之间的通信是通过服务器这个桥梁实现的,客户端发送消息时,携带客户端的id以及想要建立通信的对方id,存入Session,当某个id的客户端发来消息,服务器主动推送到目标客户端,从而实现即时通信。

2 服务器端代码

2.1 配置文件WebSocketConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** @author 吼吼权* @version 1.0* @date 2021/3/11 15:45*/
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}

2.2 与客户端建立连接

import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;/*** @author 吼吼权* @version 1.0* @date 2021/3/11 15:47*/
//ws://localhost:8848/websocket/A
@ServerEndpoint(value = "/websocket/{userId}")
@Component
public class WebSocketEndpoint {// 与某个客户端的连接会话,需要通过它来给客户端发送数据private Session session;/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session , @PathParam("userId") String userId){// 分解获取的参数,把参数信息放入到session key中,以方便后续使用//把会话放入连接池this.session = session;SessionPool.sessions.put(userId, session);}/***关闭连接*/@OnClosepublic void onClose(Session session) throws IOException {SessionPool.close(session.getId());session.close();}/*** 收到客户端消息后调用的方法** @param message 客户端发来的消息* @param session*/@OnMessagepublic void onMessage(String message, Session session) {System.out.println("客户端发来的消息"+message);SessionPool.sendMessage(message);}}

2.3 新建SessionPool发送消息到客户端

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ntu.treatment.service.Impl.UserServiceImpl;
import com.ntu.treatment.utils.SpringUtil;
import javax.websocket.Session;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** @author 吼吼权* @version 1.0* @date 2021/3/11 15:57*/
public class SessionPool {public static Map<String, Session> sessions = new ConcurrentHashMap<>();public static void close(String sessionId) throws IOException {for (String userId : SessionPool.sessions.keySet()) {Session session = SessionPool.sessions.get(userId);if (session.getId().equals(sessionId)){sessions.remove(userId);break;}}}public static void sendMessage(String message) {session.getAsyncRemote().sendText(message);}
}

这里如果要实现发送消息到某一个客户端,那么你要重写sendMessage()这个函数,并且在代码中加入 Session session = sessions.get(toUserIds);
toUserIds是你要发送的客户端的id。如下:

public static void sendMessage(String message) {String toUserIds = *****;Session session = sessions.get(toUserIds);session.getAsyncRemote().sendText(message);}

即可发送消息至目标客户端。

3、客户端代码

安卓端连接服务器的url为:ws://10.8.113.79:8848/websocket/id
ws为websocket的协议。
安卓端代码就不完全展示了,后面将会把完整项目代码的GitHub地址放在底部。

首先连接服务器

/*** 初始化websocket连接*/private void initSocketClient() {URI uri = URI.create(Util.ws);client = new JWebSocketClient(uri) {@Overridepublic void onMessage(String message) {Log.e("JWebSocketClientService", "收到的消息:" + message);Intent intent = new Intent();intent.setAction("com.xch.servicecallback.content");intent.putExtra("message", message);sendBroadcast(intent);checkLockAndShowNotification(message);}@Overridepublic void onOpen(ServerHandshake handshakedata) {super.onOpen(handshakedata);Log.e("JWebSocketClientService", "websocket连接成功");}};connect();}/*** 连接websocket*/private void connect() {new Thread() {@Overridepublic void run() {try {//connectBlocking多出一个等待操作,会先连接再发送,否则未连接发送会报错client.connectBlocking();} catch (InterruptedException e) {e.printStackTrace();}}}.start();}

然后发送消息

/*** 发送消息** @param msg*/public void sendMsg(JSONObject msg) {if (null != client) {Log.e("JWebSocketClientService", "发送的消息:" + msg);client.send(msg.toString());}}

本篇博客主要还是以介绍和理解websocket为主,能力有限,大体就介绍到这儿,另外奉上此项目的GitHub地址,不要忘了star哦!
GitHub链接

Android实现即时聊天相关推荐

  1. android简单即时聊天sdk

    android简单即时聊天sdk 切换用户登录的实现 联系人列表的实现 聊天页的实现 消息缓存与排序 消息接收和分发--数据库队列和投递队列 有序列表的维护 切换用户登录的实现 由于不同的登录用户需要 ...

  2. Android 开发即时聊天工具 YQ :(四) 获取好友列表

    在Android 开发即时聊天工具 YQ :(三) 实现登陆功能中已经实现了登陆功能,离能聊天又近了一步了 :) 在实现聊天之前还有一个重要的东西,?没错,就是好友列表,没的好友你和谁聊呀,是吧, 嘿 ...

  3. android 即时聊天工具 yq,Android 开发即时聊天工具 YQ :(四) 获取好友列表

    实现聊天之前还有一个重要的东西,?没错,就是好友列表,没的好友你和谁聊呀,是吧, 嘿嘿,一切从简,早点实现基本的聊天目标的说,所以代码很懒(or 烂?),为什么呢?看完就知道了, 在服务器端当登陆成功 ...

  4. Android 开发即时聊天工具 YQ :(六) 最近会话列表

    实现的效果如图: RecentActivity: public class RecentActivity extends Activity{ListView listView;List<Rece ...

  5. Android 开发即时聊天工具 YQ :(五) 发送消息

    服务器端转发消息功能上节已经实现,只需将消息转发给消息包中的接收人即可, if(m.getType().equals(YQMessageType.COM_MES)){//如果是普通消息包 //取得接收 ...

  6. Android 开发即时聊天工具 YQ :(三) 实现登陆功能

    前面socket基本通信完了,登陆界面也已经完成,下面就是重点了,实现登陆功能 服务器和客户端的代码当然不肯能用那个控制台的那个了,所以全部得重写,不过原理都一样,代码也差不多,都有注释,一看就明白. ...

  7. android接入即时IM(接入亲加通信云)

    项目下载地址:https://github.com/townkoim/Andorid_Goty_Im_ 说明:项目为一个商业项目.有在各大市场上线.里面包含了,第三方登录,分享,推送.即时IM聊天功能 ...

  8. android 第三方 im,Android基于环信SDK开发IM即时聊天

    目前市面上我了解的做第三方即时聊天SDK的有两家:环信.融云,这里我使用环信SDK来完成即时聊天的初步开发工作. 下面先奉上1张效果图: 1.开发准备 首先要到环信官网注册开发者账号,目前只有企业账号 ...

  9. Android基于环信SDK开发IM即时聊天(一)

    2016-09-02更新:可以看一下最新的这篇文章和源码,Android基于环信SDK开发IM即时聊天(二) 目前市面上我了解的做第三方即时聊天SDK的有两家:环信.融云,这里我使用环信SDK来完成即 ...

  10. 环信sdk android 聊天,Android基于环信SDK开发IM即时聊天

    根据用户移动地图的位置,显示在视野范围内的建筑物,简单的思路是,添加地图监听,当地图移动结束之后,计算出当前屏幕四个角的GeoPoint,根据这4个点,通过mys 目前市面上我了解的做第三方即时聊天S ...

最新文章

  1. macos下使用aria2_用Aria2代替Firefox内置的下载器
  2. mysql无法插入行_在mysql中数据才插入20多行就报错,求救啊!!!
  3. 将获取到的JSONObject和JSONArray转换为实体对象
  4. python3.6.5安装教程-Centos7 安装Python3.6.5步骤
  5. LeetCode Construct Quad Tree(dfs)
  6. 004_Spring Data JPA根据实例查询数据
  7. 【编程之美】3.5 最短摘要的生成
  8. thinking-in-java(14)类型信息
  9. visio科学图形包_科学网—科研必备:几款好用的流程图工具,助力你的论文/科研绘图...
  10. 用到f6的快捷键_简单上手excel秘籍:6大Excel技巧展示+50个常用快捷键!会这些就够了...
  11. luaL_dofile和luaL_loadfile的区别
  12. pandas 学习 —— pivot table
  13. go任务调度2(linux的cron调用)
  14. chrome浏览器无法打开网页怎么办
  15. 在Ubuntu中安装Chrome浏览器
  16. Python初探(四,五)
  17. nokia s40 java软件_诺基亚S40手机实现后台教程
  18. Unity ACT游戏相机逻辑
  19. 带上传进度的文件上传
  20. 无线mesh网络(多跳(multi-hop)网络)

热门文章

  1. 计算机网络技术文档心得,计算机网络技术学习心得体会.docx
  2. 0基础学软件测试工程师好学吗?
  3. 机器人学与OROCOS-KDL(一)简介
  4. AppLocker绕过之路
  5. 考研最后冲刺:这些要提前准备!
  6. vivo市场API事件上报对接
  7. 【线代】线性方程组求解概念:齐次/非齐次方程的解?非零解、无穷多解、求解、求通解、方程有解时求全部解,是什么意思?
  8. 涉密打印机与设密计算机之间采用,涉密打印机与涉密计算机之间 - 作业在线问答...
  9. 计算机内打不开小米路由器,电脑无法访问小米路由器的解决办法是什么
  10. 闲置手机不要换锅换盆,你会后悔的