软件工程 2016.7.3 日报
软件工程 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 日报相关推荐
- 长安大学水利计算机专业等级,2016年长安大学计算机类(含计算机科学与技术、软件工程、网络工程等4个专业)专业最低分是多少?...
类似问题答案 长安大学计算机类(含计算机科学与技术.软件工程.网络工程等4个专业)专业2016年... 学校 地 区 专业 年份 批次 类型 分数 长安大学 江苏 计算机类(含计算机科学与技术.软件工 ...
- 绥化学院计算机专业咋样,绥化学院计算机类(含计算机科学与技术、软件工程)专业2016年在河北理科高考录取最低分数线...
类似问题答案 绥化学院计算机类(含计算机科学与技术.软件工程)专业2016年在安徽理科高考录取最... 学校 地 区 专业 年份 批次 类型 分数 绥化学院 安徽 计算机类(含计算机科学与技术.软件工 ...
- 武科大计算机专业分数线,武汉科技大学计算机类(中外合作办学)专业2016年在湖北理科高考录取最低分数线...
类似问题答案 广西科技大学计算机类(中外合作办学)(软件工程)专业2016年在湖北理科高考录取最... 学校 地 区 专业 年份 批次 类型 分数 广西科技大学 湖北 计算机类(中外合作办学)(软件工 ...
- 山西能源计算机专业,山西能源学院计算机科学与技术专业2016年在四川理科高考录取最低分数线...
类似问题答案 四川大学计算机科学与技术专业2016年在山西理科高考录取最低分数线 学校 地 区 专业 年份 批次 类型 分数 四川大学 山西 计算机科学与技术 2016 一批 理科 610 学校 地 ...
- 软件工程新生需要注意什么?
背景:985末流院校软件工程,学科评估为A–. 虽然我走的是保研路线,但是也实习过一段时间,对工作也有一点了解. 这里我先反对一下高赞答案里的书单.不可否认,确实有部分是该领域的经典教材,但是我并不推 ...
- 宜春学院c语言期末试题,宜春学院计算机科学与技术专业2016年在四川理科高考录取最低分数线...
类似问题答案 哈尔滨学院计算机类(含计算机科学与技术专业.网络工程专业)专业2016年在四川理科... 学校 地 区 专业 年份 批次 类型 分数 哈尔滨学院 四川 计算机类(含计算机科学与技术专业. ...
- 福建工程学院计算机科学类投档线,福建工程学院计算机科学与技术专业2016年在山东理科高考录取最低分数线...
类似问题答案 福建工程学院计算机科学与技术专业2016年在福建理科高考录取最低分数线 学校 地 区 专业 年份 批次 类型 分数 福建工程学院 福建 计算机科学与技术 2016 二批 理科 468 学 ...
- 清华团队将Transformer用到3D点云分割上后,效果好极了
萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 当Transformer遇上3D点云,效果会怎么样? 一个是当下最热门的模型(NLP.图像领域表现都不错),另一个是自动驾驶领域.机器人抓取 ...
- 清华团队将Transformer用到3D点云分割
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 当Transformer遇上3D点云,效果会怎么样? 一个是当下最 ...
- 清华大学提出点云Transformer!在3D点云分类、分割上表现优秀,核心代码已开源!...
点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要5分钟 Follow小博主,每天更新前沿干货 转载自:量子位 当Transformer遇上3D点云,效果会怎么样? 一个是当下最热门的模型(N ...
最新文章
- 某程序员吐槽:潮汕女朋友狮子大开口要18万8彩礼,而且只能男友父母出,不能男友出!...
- Java开发web的几种开发模式
- 在log4j中使用自定义的Appender
- 【PMP学习笔记】:二、项目运行环境
- UpdateProgress控件
- 【英语学习】【WOTD】disparage 释义/词源/示例
- 代码jquery分享一款jquery加载csv文件的代码
- 没革哪有新?看云计算在医疗行业的版图
- 对字符串进行折半查找c语言,C语言:编写折半查找函数
- Spring的核心思想,这篇文章短小精悍的总结透了
- ssh 登录linux xsell 登录Linux 提示用户密钥登录怎么解决
- IAST 技术进阶系列(二):全场景多核驱动
- 体育计算机培训心得,体育培训心得体会(精选4篇)
- jca 实例 java_采用jca分析javacore文件示例
- php自定义函数全局声明,【phpcms-v9】phpcms-v9中自定义全局函数文件:extention.func.php...
- 让PPT更好看的方法,需要的朋友快来吧
- 多股电线与单股电线怎么选
- 前端框架Vue(11)——Vue+表单验证 VeeValidate 实践
- Win10“启动”文件夹在哪里?如何打开Win10启动文件夹?
- Word插入的表格怎么合并单元格
热门文章
- 近来接连换了U盘、剃须刀,京东服务确实好
- 泰山游记:绝顶海拔1525米
- 重装驱动:Failed to initialize NVML: Driver/library version mismatch
- NWT失败反思:公司都死了,还怕得罪人
- basic语言基础 chm_拒付论文装订费错失博士学位,C语言之父毕业论文丢失52年重见天日...
- php限制单设备登录,app限制一个账号只能单设备登陆
- sap 双计量单位_SAP双计量单位配置指南CUNI.doc
- 主题背景_游戏背景音乐的种类—主题曲
- maven的安装以及配置--第一章
- Cohesity扩大云软件产品组合 目标直指云未来