Android实现即时聊天
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实现即时聊天相关推荐
- android简单即时聊天sdk
android简单即时聊天sdk 切换用户登录的实现 联系人列表的实现 聊天页的实现 消息缓存与排序 消息接收和分发--数据库队列和投递队列 有序列表的维护 切换用户登录的实现 由于不同的登录用户需要 ...
- Android 开发即时聊天工具 YQ :(四) 获取好友列表
在Android 开发即时聊天工具 YQ :(三) 实现登陆功能中已经实现了登陆功能,离能聊天又近了一步了 :) 在实现聊天之前还有一个重要的东西,?没错,就是好友列表,没的好友你和谁聊呀,是吧, 嘿 ...
- android 即时聊天工具 yq,Android 开发即时聊天工具 YQ :(四) 获取好友列表
实现聊天之前还有一个重要的东西,?没错,就是好友列表,没的好友你和谁聊呀,是吧, 嘿嘿,一切从简,早点实现基本的聊天目标的说,所以代码很懒(or 烂?),为什么呢?看完就知道了, 在服务器端当登陆成功 ...
- Android 开发即时聊天工具 YQ :(六) 最近会话列表
实现的效果如图: RecentActivity: public class RecentActivity extends Activity{ListView listView;List<Rece ...
- Android 开发即时聊天工具 YQ :(五) 发送消息
服务器端转发消息功能上节已经实现,只需将消息转发给消息包中的接收人即可, if(m.getType().equals(YQMessageType.COM_MES)){//如果是普通消息包 //取得接收 ...
- Android 开发即时聊天工具 YQ :(三) 实现登陆功能
前面socket基本通信完了,登陆界面也已经完成,下面就是重点了,实现登陆功能 服务器和客户端的代码当然不肯能用那个控制台的那个了,所以全部得重写,不过原理都一样,代码也差不多,都有注释,一看就明白. ...
- android接入即时IM(接入亲加通信云)
项目下载地址:https://github.com/townkoim/Andorid_Goty_Im_ 说明:项目为一个商业项目.有在各大市场上线.里面包含了,第三方登录,分享,推送.即时IM聊天功能 ...
- android 第三方 im,Android基于环信SDK开发IM即时聊天
目前市面上我了解的做第三方即时聊天SDK的有两家:环信.融云,这里我使用环信SDK来完成即时聊天的初步开发工作. 下面先奉上1张效果图: 1.开发准备 首先要到环信官网注册开发者账号,目前只有企业账号 ...
- Android基于环信SDK开发IM即时聊天(一)
2016-09-02更新:可以看一下最新的这篇文章和源码,Android基于环信SDK开发IM即时聊天(二) 目前市面上我了解的做第三方即时聊天SDK的有两家:环信.融云,这里我使用环信SDK来完成即 ...
- 环信sdk android 聊天,Android基于环信SDK开发IM即时聊天
根据用户移动地图的位置,显示在视野范围内的建筑物,简单的思路是,添加地图监听,当地图移动结束之后,计算出当前屏幕四个角的GeoPoint,根据这4个点,通过mys 目前市面上我了解的做第三方即时聊天S ...
最新文章
- macos下使用aria2_用Aria2代替Firefox内置的下载器
- mysql无法插入行_在mysql中数据才插入20多行就报错,求救啊!!!
- 将获取到的JSONObject和JSONArray转换为实体对象
- python3.6.5安装教程-Centos7 安装Python3.6.5步骤
- LeetCode Construct Quad Tree(dfs)
- 004_Spring Data JPA根据实例查询数据
- 【编程之美】3.5 最短摘要的生成
- thinking-in-java(14)类型信息
- visio科学图形包_科学网—科研必备:几款好用的流程图工具,助力你的论文/科研绘图...
- 用到f6的快捷键_简单上手excel秘籍:6大Excel技巧展示+50个常用快捷键!会这些就够了...
- luaL_dofile和luaL_loadfile的区别
- pandas 学习 —— pivot table
- go任务调度2(linux的cron调用)
- chrome浏览器无法打开网页怎么办
- 在Ubuntu中安装Chrome浏览器
- Python初探(四,五)
- nokia s40 java软件_诺基亚S40手机实现后台教程
- Unity ACT游戏相机逻辑
- 带上传进度的文件上传
- 无线mesh网络(多跳(multi-hop)网络)
热门文章
- 计算机网络技术文档心得,计算机网络技术学习心得体会.docx
- 0基础学软件测试工程师好学吗?
- 机器人学与OROCOS-KDL(一)简介
- AppLocker绕过之路
- 考研最后冲刺:这些要提前准备!
- vivo市场API事件上报对接
- 【线代】线性方程组求解概念:齐次/非齐次方程的解?非零解、无穷多解、求解、求通解、方程有解时求全部解,是什么意思?
- 涉密打印机与设密计算机之间采用,涉密打印机与涉密计算机之间 - 作业在线问答...
- 计算机内打不开小米路由器,电脑无法访问小米路由器的解决办法是什么
- 闲置手机不要换锅换盆,你会后悔的