本文共 1785 字,大约阅读时间需要 5 分钟。
最近面试,老是被问到会不会即时通讯,导致错失了不少的公司。
1.即时通讯的原理:
就像数学是由1+1慢慢增加难度一样,即时通讯也一样,是从Socket基础之后一点一点地做出来的。
首先要学会理解和使用ServerSocket和Socket来进行流的输入与输出。
掌握TCP/IP协议,UDP协议,3次握手到底怎么回事(面试爱问)。即时通讯用的是XMPP协议,后面
再研究。
即时通讯的分类:
2.准备工作
实体类与XML、JSON之间的相互转换
3.即时通讯类的模型构建与实体类实现
本文章以在线代理通讯来说明如何实现即时通讯,包括服务器端和客户端
1.服务器端的简单搭建:
创建一个ServerSocket,指定客户端连入的端口号,accept方法无限循环地监听客户端的状态
(登录、注销等等),因为accept方法是阻塞的,所以无限循环不会出现卡死的问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public class QQImServer { /** * @param args */ public static void main(String[] args) { try { // ① 创建一个线程 等其他客户端的连接 final ServerSocket server = new ServerSocket( 5222 ); System.out.println( "---服务器启动---" + new Date().toString()); new Thread() { // public void run() { while ( true ) { QQConnection conn = null ; try { Socket client = server.accept(); System.out.println( "---有客户端接入---" + client); // ② 如果客户端连接成功分配置一个线程 conn = new QQConnection(client); conn.addOnRecevieMsgListener( new LoginMsgListener(conn)); conn.addOnRecevieMsgListener( new ChatP2PListener()); conn.addOnRecevieMsgListener( new ChatRoomListener()); conn.addOnRecevieMsgListener( new LoginOutListener()); // ③ 该线程内等待用户数据 conn.connect(); // ④ 分配一个线程给客户端 } catch (IOException e) { e.printStackTrace(); conn.disconnect(); } } }; }.start(); } catch (Exception e) { // e.printStackTrace(); } } } |
注意上面代码中,并非一个简简单单的ServerSocket,与平常所见的小demo不一样,就是对于Client
客户端的处理逻辑显得稍微复杂了点。有几个核心类QQConnection(实则是一个线程,用来维护每一
个客户端),几个客户端状态监听器LoginMsgListener(监听上线操作)、ChatP2PListener(监
听点对点通讯)、ChatRoomListener(监听一个房间,也就是多个客户端的通讯)、
LoginOutListener(监听下线)。
上面4个监听类Listener的父类MessageSender封装了向一个或多个客户端发送消息的方法。
QQConnectionManager用来管理连接进来的客户端,管理上线和下线(包括数据库操作)
QQMessageType封装了客户端的多种状态
下面这个是服务器端的结构:
本文转自屠夫章哥 51CTO博客,原文链接:http://blog.51cto.com/4259297/1711859
转载地址:http://cvujl.baihongyu.com/