软件工程 2016.7.3日报


  在周五我初步搭建了吐槽墙的结构,实现了部分的功能。经过与组长的讨论,我们最终决定使用TCP通信的方式实现功能。因为对于这种比较明显的C/S结构,UDP方式的通信会使得整体处理信息的过程延迟比较大,不符合功能需求。

  经过讨论分析,Server和Client通信的信息主要有以下几类:

    1、Client向Server发送Client房间列表,Server端check本地是否含有所有房间,若不含的话,需要创建新文件存储响应聊天信息。

    2、Client向Server请求特定房间的聊天记录。

    3、Client向Server发送特定房间的吐槽消息。

    4、Server向Client发送特定房间的聊天记录。

    5、Server向Client发送Client端向Server端发送的消息是否更新成功的信息。

  由此我定义了一下状态字,存于所有消息的第一位,用于标记消息后续部分的作用:

1     private const byte CHECK_ROOM_LIST = 0;
2     private const byte REQUEST_ROOM_MSG = 1;
3     private const byte SEND_MSG = 2;
4     private const byte DISCONNECT = 3;
5     private const byte IS_RECEIVE_MSG = 4;
6     private const byte IS_NOT_RECEIVE_MSG = 5;
7     private const byte INVALID_MESSAGE = 6;

  对于上述消息通信,Client端向Server端发送的消息包含两部分内容,一为房间id,二为吐槽消息,所以需要定义一个结构体保存两部分的内容,而后使用JSON解析工具进行包装、解析等。结构体定义如下:

 1     public struct MsgHandler
 2     {
 3         public string roomId;
 4         public string msg;
 5
 6         public MsgHandler(string r, string m)
 7         {
 8             roomId = r; msg = m;
 9         }
10     }

  除此之外,实现了服务端的逻辑框架,以及部分的功能,已实现的代码如下:

    开启服务器

 1         public void StartServer()
 2         {
 3             // Create a socket, use IPv4, stream connection and TCP
 4             socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 5
 6             // create a endpoing which binds the ip and port
 7             IPAddress ipAddress = IPAddress.Parse(ipAddr);
 8             IPEndPoint endPoint = new IPEndPoint(ipAddress, port);
 9
10             try
11             {
12                 // bind the watching socket to the endpoint
13                 socketWatch.Bind(endPoint);
14
15                 // set the length of waiting queue
16                 socketWatch.Listen(20);
17
18                 // Create a watching thread
19                 threadWatch = new Thread(WatchConnection);
20                 // Set the background property
21                 threadWatch.IsBackground = true;
22                 // Start the thread
23                 threadWatch.Start();
24
25                 Console.WriteLine();
26                 Console.WriteLine("                          ---Server Start---");
27                 Console.WriteLine();
28
29                 return;
30             }
31             catch (SocketException se)
32             {
33                 Console.WriteLine("[SocketERROR]" + se.Message);
34                 return;
35             }
36             catch (Exception e)
37             {
38                 Console.WriteLine("[ERROR]" + e.Message);
39                 return;
40             }
41         }

    监听客户请求

 1         private void WatchConnection()
 2         {
 3             // keep watching
 4             while (true)
 5             {
 6                 Socket socketConnection = null;
 7                 try
 8                 {
 9                     // watch the request, if has, create a socket for it
10                     socketConnection = socketWatch.Accept();
11                     string socketKey = socketConnection.RemoteEndPoint.ToString();
12
13                     // save every socket with the key in the form of IP : port
14                     dictSocket.Add(socketKey, socketConnection);
15
16                     Console.WriteLine("User IP : {0} has connected...", socketKey);
17
18                     // Create a thread to watch the data sent from client for every socket
19                     // Create the communicate thread
20                     Thread threadCommunicate = new Thread(ReceiveMsg);
21                     threadCommunicate.IsBackground = true;
22                     threadCommunicate.Start(socketConnection);
23
24                     dictThread.Add(socketKey, threadCommunicate);
25
26                 }
27                 catch (SocketException se)
28                 {
29                     Console.WriteLine("[ERROR]" + se.Message);
30                     return;
31                 }
32                 catch (Exception e)
33                 {
34                     Console.WriteLine("[ERROR]" + e.Message);
35                     return;
36                 }
37             }
38         }

    监听用户信息

 1         private void ReceiveMsg(object socketClientPara)
 2         {
 3             Socket socketClient = socketClientPara as Socket;
 4             string socketKey = socketClient.RemoteEndPoint.ToString();
 5
 6             while (true)
 7             {
 8                 // define a buffer for received message
 9                 byte[] msgReceiver = new byte[1024 * 1024 * 2];
10
11                 // length of received message
12                 int length = -1;
13
14                 try
15                 {
16                     length = socketClient.Receive(msgReceiver);
17                 }
18                 catch (SocketException se)
19                 {
20                     Console.WriteLine("[ERROR]" + socketKey + " receive error. Message: " + se.Message);
21
22                     dictSocket[socketKey].Close();
23                     Thread tmp = dictThread[socketKey];
24
25                     // Remove the error object
26                     dictSocket.Remove(socketKey);
27                     dictThread.Remove(socketKey);
28                     tmp.Abort();
29
30                     return;
31                 }
32                 catch (Exception e)
33                 {
34                     Console.WriteLine("[ERROR]" + e.Message);
35                     return;
36                 }
37
38                 string msg = Encoding.UTF8.GetString(msgReceiver, 1, length - 1);
39
40                 if (msgReceiver[0] == CHECK_ROOM_LIST)
41                     CheckRoomList(msg);
42                 else if (msgReceiver[0] == REQUEST_ROOM_MSG)
43                     GetRoomMsg(socketKey, msg);
44                 else if (msgReceiver[0] == SEND_MSG)
45                     AddMsgToFile(socketKey, msg);
46                 else if (msgReceiver[0] == DISCONNECT)
47                     RemoveOfflineUser(socketKey);
48                 else
49                     InvalidMsg(socketKey);
50             }
51         }

    发送消息

 1         private void SendMessage(string clientIP, byte flag, string msg)
 2         {
 3             try
 4             {
 5                 byte[] arrMsg = Encoding.UTF8.GetBytes(msg);
 6                 byte[] sendArrMsg = new byte[arrMsg.Length + 1];
 7
 8                 // set the msg type
 9                 sendArrMsg[0] = flag;
10                 Buffer.BlockCopy(arrMsg, 0, sendArrMsg, 1, arrMsg.Length);
11
12                 dictSocket[clientIP].Send(sendArrMsg);
13             }
14             catch (SocketException se)
15             {
16                 Console.WriteLine("[SocketERROR] send message error : {0}", se.Message);
17             }
18             catch (Exception e)
19             {
20                 Console.WriteLine("[ERROR] send message error : {0}", e.Message);
21             }
22         }

转载于:https://www.cnblogs.com/fanfan-blogs/p/5639236.html

软件工程 2016.7.3 日报相关推荐

  1. 长安大学水利计算机专业等级,2016年长安大学计算机类(含计算机科学与技术、软件工程、网络工程等4个专业)专业最低分是多少?...

    类似问题答案 长安大学计算机类(含计算机科学与技术.软件工程.网络工程等4个专业)专业2016年... 学校 地 区 专业 年份 批次 类型 分数 长安大学 江苏 计算机类(含计算机科学与技术.软件工 ...

  2. 绥化学院计算机专业咋样,绥化学院计算机类(含计算机科学与技术、软件工程)专业2016年在河北理科高考录取最低分数线...

    类似问题答案 绥化学院计算机类(含计算机科学与技术.软件工程)专业2016年在安徽理科高考录取最... 学校 地 区 专业 年份 批次 类型 分数 绥化学院 安徽 计算机类(含计算机科学与技术.软件工 ...

  3. 武科大计算机专业分数线,武汉科技大学计算机类(中外合作办学)专业2016年在湖北理科高考录取最低分数线...

    类似问题答案 广西科技大学计算机类(中外合作办学)(软件工程)专业2016年在湖北理科高考录取最... 学校 地 区 专业 年份 批次 类型 分数 广西科技大学 湖北 计算机类(中外合作办学)(软件工 ...

  4. 山西能源计算机专业,山西能源学院计算机科学与技术专业2016年在四川理科高考录取最低分数线...

    类似问题答案 四川大学计算机科学与技术专业2016年在山西理科高考录取最低分数线 学校 地 区 专业 年份 批次 类型 分数 四川大学 山西 计算机科学与技术 2016 一批 理科 610 学校 地 ...

  5. 软件工程新生需要注意什么?

    背景:985末流院校软件工程,学科评估为A–. 虽然我走的是保研路线,但是也实习过一段时间,对工作也有一点了解. 这里我先反对一下高赞答案里的书单.不可否认,确实有部分是该领域的经典教材,但是我并不推 ...

  6. 宜春学院c语言期末试题,宜春学院计算机科学与技术专业2016年在四川理科高考录取最低分数线...

    类似问题答案 哈尔滨学院计算机类(含计算机科学与技术专业.网络工程专业)专业2016年在四川理科... 学校 地 区 专业 年份 批次 类型 分数 哈尔滨学院 四川 计算机类(含计算机科学与技术专业. ...

  7. 福建工程学院计算机科学类投档线,福建工程学院计算机科学与技术专业2016年在山东理科高考录取最低分数线...

    类似问题答案 福建工程学院计算机科学与技术专业2016年在福建理科高考录取最低分数线 学校 地 区 专业 年份 批次 类型 分数 福建工程学院 福建 计算机科学与技术 2016 二批 理科 468 学 ...

  8. 清华团队将Transformer用到3D点云分割上后,效果好极了

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 当Transformer遇上3D点云,效果会怎么样? 一个是当下最热门的模型(NLP.图像领域表现都不错),另一个是自动驾驶领域.机器人抓取 ...

  9. 清华团队将Transformer用到3D点云分割

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 当Transformer遇上3D点云,效果会怎么样? 一个是当下最 ...

  10. 清华大学提出点云Transformer!在3D点云分类、分割上表现优秀,核心代码已开源!...

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要5分钟 Follow小博主,每天更新前沿干货 转载自:量子位 当Transformer遇上3D点云,效果会怎么样? 一个是当下最热门的模型(N ...

最新文章

  1. 某程序员吐槽:潮汕女朋友狮子大开口要18万8彩礼,而且只能男友父母出,不能男友出!...
  2. Java开发web的几种开发模式
  3. 在log4j中使用自定义的Appender
  4. 【PMP学习笔记】:二、项目运行环境
  5. UpdateProgress控件
  6. 【英语学习】【WOTD】disparage 释义/词源/示例
  7. 代码jquery分享一款jquery加载csv文件的代码
  8. 没革哪有新?看云计算在医疗行业的版图
  9. 对字符串进行折半查找c语言,C语言:编写折半查找函数
  10. Spring的核心思想,这篇文章短小精悍的总结透了
  11. ssh 登录linux xsell 登录Linux 提示用户密钥登录怎么解决
  12. IAST 技术进阶系列(二):全场景多核驱动
  13. 体育计算机培训心得,体育培训心得体会(精选4篇)
  14. jca 实例 java_采用jca分析javacore文件示例
  15. php自定义函数全局声明,【phpcms-v9】phpcms-v9中自定义全局函数文件:extention.func.php...
  16. 让PPT更好看的方法,需要的朋友快来吧
  17. 多股电线与单股电线怎么选
  18. 前端框架Vue(11)——Vue+表单验证 VeeValidate 实践
  19. Win10“启动”文件夹在哪里?如何打开Win10启动文件夹?
  20. Word插入的表格怎么合并单元格

热门文章

  1. 近来接连换了U盘、剃须刀,京东服务确实好
  2. 泰山游记:绝顶海拔1525米
  3. 重装驱动:Failed to initialize NVML: Driver/library version mismatch
  4. NWT失败反思:公司都死了,还怕得罪人
  5. basic语言基础 chm_拒付论文装订费错失博士学位,C语言之父毕业论文丢失52年重见天日...
  6. php限制单设备登录,app限制一个账号只能单设备登陆
  7. sap 双计量单位_SAP双计量单位配置指南CUNI.doc
  8. 主题背景_游戏背景音乐的种类—主题曲
  9. maven的安装以及配置--第一章
  10. Cohesity扩大云软件产品组合 目标直指云未来