前段时间写了个自定义通信协议的聊天室(即用\r\n标记字符串,作为一句话),总感觉自己弄的那个协议实现虽然简单,但是拓展性就太差了,只适合于发送聊天的内容,难以包含更多的信息。基于上述几点,于是就开始接触Xmpp协议,并自己定义了一个简单的Xmpp协议用以实现聊天室。

首先有2点要知道: 
1.什么是Xmpp协议? 
  Xmpp协议是一种通信协议,有自己的规则,即用Xml格式的消息进行通信。 
2.Xml串的例子。 
  <msg><name>laoyang</name><msg> 
  上述是一条完整的Xml消息,首尾由<msg></msg>标识,里面就是消息的内容,不同的内容用不同的标签来标识,如<name></name>,然后name包含的内容,即名字就是laoyang

然后,这次不同于上次的是,我自己对这个聊天室做了一番分析,然后再实现的。

分析: 
一.需求分析: 
S.服务器: 
启动|暂停服务器,对所有用户发送通知,对某个用户发送私信,实时显示在线用户列表,踢掉某个用户 
C.客户端: 
能注册账号,能登陆,可以向某个用户发送消息,可以向所有人发送消息,实时显示在线用户列表 
二.C/S通信流程: 
A:注册(C------>S) >>>>> 注册应答(S--------->C)>>>>>> 返回登陆界面

B:登陆(C--------->S) >>>>>>> 登陆应答(S--------->C)>>>>>>> (失败)返回登陆界面,(成功)进入聊天界面&&上线消息(S------->C&&发送在线用户表(S------------>C)

C:聊天(C--------->S------------>C)

D:下线 >>>>>> 发送下线消息(S--------->C)>>>>>>> 发送在线用户表(S---->C) 
三.Xml串的种类: 
a. 注册消息: <msg><type>register</type><IDcode>idnumber</IDcode><password>psw</password><username>name</username></msg> 
b. 注册应答消息:<msg><type>regAns</type><answer>state</answer></msg> state:注册成功或者注册失败 
c. 登陆消息:<msg><type>login</type><IDcode>idnumber</IDcode><password>psw</password></msg> 
d. 登陆应答消息:<msg><type>loginAns</type><answer>state</answer><msg> state:登陆成功或者登陆失败 
e. 聊天消息:<msg><type>chat</type><sender>name</sender><reciver>name</reciver><content>message</content></msg> 
f. 上线消息:<msg><type>online</type><content>cnt</content></msg> 
g. 下线消息: <msg><type>offline</type><content>cnt</content></msg> 
h. 在线用户表: <msg><type>onlinelist</type><list>user1,user2,user3.....</list></msg> 
i. 终止用户聊天的消息<msg><type>exit</type></msg> 
四.关于类的结构的分析(由于内容有点多,所以放在附件的文本中,此处不再写出)

部分图片:

感想: 
1.做软件,最重要,最关键的一步在于设计,所以在开始写代码前,一定要先分析需求,然后还要对如何实现做一个具体的分析与设计。 
2.要进行通信,必须要有通信协议,做通信软件,必须要选择合适的通信协议。 
3.测试软件性能时,要考虑各种意外情况的发生,比如:突然断网,服务器那边突然停电,So on....,这时要把异常处理的工作给做好。

展望: 
本人也是个铁杆Dotaer,所以下一步的打算是做一个对战平台,上网搜了下原理,也看了下别人做的对战平台,觉得还是能够自己实现的,不过以后的日子就苦逼啦。 TCP/IP的书必须要去看了,对战平台的需求分析必须要去做了。

最后,附上源码和相关的文本(相关分析的文件用记事本打开就可以)

通信——基于Xmpp协议实现的聊天室的更多相关文章

  1. 基于XMPP协议的Android即时通信系

    以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务 ...

  2. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  3. 基于XMPP协议的手机多方多端即时通讯方案

    一.开发背景 1.国际背景 随着Internet技术的高速发展,即时通信已经成为一种广泛使用的通信方式.1996年Mirabilis公司推出了世界上第一个即时通信系统ICQ,不到10年间,即时通信(I ...

  4. 基于 OpenResty 实现一个 WS 聊天室

    基于 OpenResty 实现一个 WS 聊天室 WebSocket WebSocket 协议分析 WebSocket 协议解决了浏览器和服务器之间的全双工通信问题.在WebSocket出现之前,浏览 ...

  5. .net平台 基于 XMPP协议的即时消息服务端简单实现

    .net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...

  6. 基于Linux的TCP网络聊天室

    1.实验项目名称:基于Linux的TCP网络聊天室 2.实验目的:通过TCP完成多用户群聊和私聊功能. 3.实验过程: 通过socket建立用户连接并传送用户输入的信息,分别来写客户端和服务器端,利用 ...

  7. 计算机网络课设之基于UDP协议的简易聊天机器人

    前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C ...

  8. 基于XMPP协议(openfire服务器)的消息推送实现

    转自:http://blog.csdn.net/nomousewch/article/details/8088277 最近好像有不少朋友关注Android客户端消息推送的实现,我在之前的项目中用到过J ...

  9. 基于LINUX的多功能聊天室

    原文:基于LINUX的多功能聊天室 基于LINUX的多功能聊天室 其实这个项目在我电脑已经躺了多时,最初写完项目规划后,我就认认真真地去实现了它,后来拿着这个项目区参加了面试,同样面试官也拿这个项目来 ...

随机推荐

  1. 细说shiro之五:在spring框架中集成shiro

    官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...

  2. Devexpress GridControl切换数据源

    gridControl1.DataSource = dt1; (gridControl1.DefaultView as GridView).Columns.Clear();//切换前需要先把列清空了. ...

  3. Linq中Sum和Group的使用

    ].AsEnumerable() group c by c.Field<int>("Name") into s select new { ID = s.Select(m ...

  4. Java8新特性_接口中的默认方法

    默认方法由来猜想 1. Collection接口.Collections公共类.  同是操作集合,为啥要搞俩?没必要.在接口中搞一些默认实现,一个接口即搞定了. 2. Java8支持Lambda表达式 ...

  5. l类与对象课后作业

    java 的初始化规律 执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”. 执行类的构造函数. 类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行.因 ...

  6. [C++]四分树(Quadtrees)

    [本博文非博主原创,思路与题目均摘自 刘汝佳<算法竞赛与入门经典(第2版)>] 四分树Quadtrees 一幅图有1024个点, 可以对图平均分成4块, 并且子图也可以再往下分, 直到一个 ...

  7. 前端面试(二):N轮面试

    一面 在一面中要掌握什么技巧,主要考察前端开发的基础知识 1.面试技巧.页面布局类 页面布局小结: 语义化掌握到位 页面布局理解深刻 CSS基础知识扎实 思维灵活且积极上进 代码书写规范 2.CSS盒 ...

  8. 往github上传代码忽略node_modules文件夹

    首先必须在你初始化  git 仓库的那个文件夹建立 .gitigonre 文件,在这个文件夹里面写入下面代码 node_modules npm-debug.log package-lock.json ...

  9. mui卡片视图的制作

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 源码学习之mybatis

    1.先看看俩种调用方式 public static void main(String[] args) { SqlSessionFactory sqlSessionFactory; SqlSession ...