博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
即时通讯-没有那么可怕
阅读量:6927 次
发布时间:2019-06-27

本文共 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/

你可能感兴趣的文章
网页中, 代码调用360手机助手一键安装程序到手机
查看>>
IOS详解TableView——选项抽屉(天猫商品列表)
查看>>
[转]地图投影
查看>>
WorldWind源码剖析系列:影像图层类ImageLayer
查看>>
《Programming WPF》翻译 第8章 3.Storyboard
查看>>
HttpUrlConnection 的 setDoOutput 与 setDoInput
查看>>
RHEL6.4编译安装gcc4.8.1
查看>>
升级到Windows10
查看>>
理解并发,避免死锁
查看>>
Codeforces 549F Yura and Developers
查看>>
动态创建 Lambda 表达式
查看>>
Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php
查看>>
OGG-01224 Bad file number
查看>>
Python 2.7 学习笔记 条件与循环语句
查看>>
c#并行扫描端口控制台程序
查看>>
Advice for students of machine learning--转
查看>>
ASP.NET通过byte正确安全的判断上传文件格式
查看>>
mongodb分布式查询
查看>>
【设计模式】适配器模式
查看>>
linux:Nginx+https双向验证(数字安全证书)
查看>>