最近面试,老是被问到会不会即时通讯,导致错失了不少的公司。
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


172万+

被折叠的 条评论
为什么被折叠?



