软件工程 2016.7.4日报

软件工程 2016.7.4日报



  今天我进行的主要工作包括了完成服务器端功能的搭建,以及客户端socket通信功能架构的搭建以及部分功能的实现。

  对服务器端,在周五的时候我对于接受消息、处理消息部分的功能还没有实现,今天将代码补全,构建出了一个较完善的服务端代码。

  今天具体实现的代码如下:

    主要实现了检查本地是否包含用户所上的全部课程的聊天室,返回特定聊天室的聊天记录给用户,向特定聊天室记录文件中添加吐槽,以及移除在线好友,处理非法信息等。

    在实现的过程中运用的主要技术包括C#文件操作、JSON封装/解析数据、socket TCP通信等。

  1         #region --- Check Room List ---
  2         /// <summary>
  3         ///     Check the existence of every room in room list received from client
  4         /// </summary>
  5         /// <param name="msg">string of room list</param>
  6         private void CheckRoomList(string s_roomList)
  7         {
  8             // TODO : check the existence of chat file of each room
  9             List<string> roomList = (List<string>)JsonConvert.DeserializeObject(s_roomList, typeof(List<string>));
 10
 11             foreach (string room in roomList)
 12             {
 13                 string roomFile = room + ".txt";
 14                 if (!File.Exists(@roomFile))
 15                 {
 16                     FileStream fs = new FileStream(roomFile, FileMode.Create);
 17                     fs.Close();
 18                 }
 19             }
 20
 21         }
 22         #endregion
 23
 24         #region --- Get Room Message ---
 25         /// <summary>
 26         ///     get the history message of the specific chat room
 27         /// </summary>
 28         /// <param name="clientIP">the client IP</param>
 29         /// <param name="msg">the room ID</param>
 30         private void GetRoomMsg(string clientIP, string roomId)
 31         {
 32             // TODO : get the history of specific chat room
 33             string roomFile = roomId + ".txt";
 34
 35             List<string> msgList = new List<string>();
 36
 37             String sendMsg = "";
 38
 39             if (File.Exists(@roomFile))
 40             {
 41                 StreamReader sr = new StreamReader(roomFile, Encoding.Default);
 42
 43                 String lineMsg;
 44                 while ((lineMsg = sr.ReadLine()) != null)
 45                     msgList.Add(lineMsg);
 46                 sendMsg = JsonConvert.SerializeObject(msgList);
 47             }
 48             else
 49             {
 50                 FileStream fs = new FileStream(roomFile, FileMode.Create);
 51                 fs.Close();
 52             }
 53
 54             SendMessage(clientIP, REQUEST_ROOM_MSG, sendMsg);
 55         }
 56         #endregion
 57
 58         #region --- Add Message To File ---
 59         /// <summary>
 60         ///     put the message into the specific room
 61         /// </summary>
 62         /// <param name="clientIP">the client IP</param>
 63         /// <param name="msg">the string include the room id and received message</param>
 64         private void AddMsgToFile(string clientIP, string msg)
 65         {
 66             // TODO : put the message into the specific room
 67             MsgHandler msgHandler = (MsgHandler)JsonConvert.DeserializeObject(msg, typeof(MsgHandler));
 68
 69             string roomFile = msgHandler.roomId + ".txt";
 70
 71             FileStream fs = new FileStream(roomFile, FileMode.OpenOrCreate);
 72             StreamWriter sw = new StreamWriter(fs);
 73             sw.WriteLine(msgHandler.msg);
 74             sw.Close();
 75             fs.Close();
 76         }
 77         #endregion
 78
 79         #region --- Remove Offline User ---
 80         /// <summary>
 81         ///     remove off line user
 82         /// </summary>
 83         /// <param name="clientIP">the client IP</param>
 84         private void RemoveOfflineUser(string clientIP)
 85         {
 86             Console.WriteLine("User IP : " + clientIP + " has went off line.");
 87
 88             if (dictSocket.ContainsKey(clientIP))
 89             {
 90                 dictSocket[clientIP].Close();
 91                 dictSocket.Remove(clientIP);
 92             }
 93
 94             if (dictThread.ContainsKey(clientIP))
 95             {
 96                 Thread tmp = dictThread[clientIP];
 97                 dictThread.Remove(clientIP);
 98                 tmp.Abort();
 99             }
100
101         }
102         #endregion
103
104         #region --- Invalid Message ---
105         /// <summary>
106         ///     Handle the situation of invalid message
107         /// </summary>
108         /// <param name="clientIP">the client ip</param>
109         private void InvalidMsg(string clientIP)
110         {
111             // TODO : send invalid warning to client
112             SendMessage(clientIP, INVALID_MESSAGE, "");
113         }
114         #endregion

    在客户端我构建了一个程序的架子,并且实现了部分功能。留下没有实现的功能涉及到和UI端的交互问题,目前我还没有想的比较清楚要如何完成这一部分的交互。因为我client在收到消息时是不太容易能够让UI端知道 的,所以要通知UI端对控件内容作更改目前也没有比较好的解决方法。目前想到的方法就是我这边直接去操作UI端的控件,不必通知UI,由我这边直接对空间内容进行修改。但这个方法总觉得不理想,如果有人能够对此类问题有一个较好的解决方法的话请留言告诉我,谢谢!

    今天在UI端实现的代码主要如下:

  1         #region --- Connect To The Server ---
  2         /// <summary>
  3         ///     Connect to the server
  4         /// </summary>
  5         public Client()
  6         {
  7             // get IP address
  8             IPAddress address = IPAddress.Parse(ipAddr);
  9             // create the endpoint
 10             IPEndPoint endpoint = new IPEndPoint(address, port);
 11             // create the socket, use IPv4, stream connection and TCP protocol
 12             socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 13             try
 14             {
 15                 // Connect to the Server
 16                 socketClient.Connect(endpoint);
 17
 18                 threadClient = new Thread(ReceiveMsg);
 19                 threadClient.IsBackground = true;
 20                 threadClient.Start();
 21             }
 22             catch (SocketException se)
 23             {
 24                 MessageBox.Show("[SocketError]Connection failed: " + se.Message);
 25             }
 26             catch (Exception ex)
 27             {
 28                 MessageBox.Show("[Error]Connection failed: " + ex.Message);
 29             }
 30         }
 31         #endregion
 32
 33         #region --- Check Room List ---
 34         /// <summary>
 35         ///     check room list
 36         /// </summary>
 37         /// <param name="roomList"></param>
 38         public void CheckRoomList(List<string> roomList)
 39         {
 40             string s_roomList = JsonConvert.SerializeObject(roomList);
 41
 42             SendMsg(CHECK_ROOM_LIST, s_roomList);
 43         }
 44         #endregion
 45
 46         #region --- Add New Message ---
 47         /// <summary>
 48         ///     add new message
 49         /// </summary>
 50         /// <param name="roomId"></param>
 51         /// <param name="msg"></param>
 52         public void AddNewMsg(string roomId, string msg)
 53         {
 54             MsgHandler msgHandler = new MsgHandler(roomId, msg);
 55             string sendMsg = JsonConvert.SerializeObject(msgHandler);
 56
 57             SendMsg(SEND_MSG, sendMsg);
 58         }
 59         #endregion
 60
 61         #region --- Off Line ---
 62         /// <summary>
 63         ///     go off line
 64         /// </summary>
 65         public void GoOffLine()
 66         {
 67             SendMsg(DISCONNECT, "");
 68         }
 69         #endregion
 70
 71         #region --- Send Message ---
 72         /// <summary>
 73         ///     Send Message
 74         /// </summary>
 75         /// <param name="flag">msg type</param>
 76         /// <param name="msg">message</param>
 77         private void SendMsg(byte flag, string msg)
 78         {
 79             try
 80             {
 81                 byte[] arrMsg = Encoding.UTF8.GetBytes(msg);
 82                 byte[] sendArrMsg = new byte[arrMsg.Length + 1];
 83
 84                 // set the msg type
 85                 sendArrMsg[0] = flag;
 86                 Buffer.BlockCopy(arrMsg, 0, sendArrMsg, 1, arrMsg.Length);
 87
 88                 socketClient.Send(sendArrMsg);
 89             }
 90             catch (SocketException se)
 91             {
 92                 Console.WriteLine("[SocketError] send message error : {0}", se.Message);
 93             }
 94             catch (Exception e)
 95             {
 96                 Console.WriteLine("[Error] send message error : {0}", e.Message);
 97             }
 98         }
 99         #endregion
100
101         #region --- Receive Message ---
102         /// <summary>
103         ///     receive message
104         /// </summary>
105         private void ReceiveMsg()
106         {
107             while (true)
108             {
109                 // define a buffer for received message
110                 byte[] arrMsg = new byte[1024 * 1024 * 2];
111
112                 // length of message received
113                 int length = -1;
114
115                 try
116                 {
117                     // get the message
118                     length = socketClient.Receive(arrMsg);
119
120                     // encoding the message
121                     string msgReceive = Encoding.UTF8.GetString(arrMsg, 1, length-1);
122
123                     if (arrMsg[0] == SEND_MSG)
124                     {
125
126                     }
127                     else if (arrMsg[0] == IS_RECEIVE_MSG)
128                     {
129
130                     }
131                     else if (arrMsg[0] == IS_NOT_RECEIVE_MSG)
132                     {
133
134                     }
135                     else if (arrMsg[0] == INVALID_MESSAGE)
136                     {
137
138                     }
139                     else
140                     {
141
142                     }
143
144                 }
145                 catch (SocketException se)
146                 {
147                     //MessageBox.Show("【错误】接收消息异常:" + se.Message);
148                     return;
149                 }
150                 catch (Exception e)
151                 {
152                     //MessageBox.Show("【错误】接收消息异常:" + e.Message);
153                     return;
154                 }
155             }
156         }
157         #endregion

    在ReceiveMsg中那几个if else中空出来的部分就是涉及到与UI端交互的部分。

    除此之外,今天晚上在和组长进行讨论时,发现对于服务端在操作文件时要为每个文件加一个锁,这样才能保证数据的同步。所以这也是之后需要修改的地方。

时间: 2024-12-17 22:15:30

软件工程 2016.7.4日报的相关文章

软件工程 2016.7.3 日报

软件工程 2016.7.3日报 在周五我初步搭建了吐槽墙的结构,实现了部分的功能.经过与组长的讨论,我们最终决定使用TCP通信的方式实现功能.因为对于这种比较明显的C/S结构,UDP方式的通信会使得整体处理信息的过程延迟比较大,不符合功能需求. 经过讨论分析,Server和Client通信的信息主要有以下几类: 1.Client向Server发送Client房间列表,Server端check本地是否含有所有房间,若不含的话,需要创建新文件存储响应聊天信息. 2.Client向Server请求特定

软件工程 2016.6.30 日报

软件工程 2016.6.30 日报 今天主要学习的内容是C# socket网络编程中的TCP通讯技术.socket编程的原理如下: 在服务端的处理流程为: (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接. (3)当完成通信后,服务器关闭与客户端的Socket连接. 在服务端的处理流程为: (1)建立客户端的Socket,确定要连接的服务器的主机名和端口. (2)发送连接请求到服务器,

软件工程 2016.6.29 日报

软件工程 2016.6.29 日报 今天我的主要工作就是调查了解我校的加权平均分计算方法,并将程序加权计算部分予以修正. 通过查阅北工大教务公示,获得信息: 第十条学校利用“学分通过率”和“加权平均分”作为衡量学生在校期间学习质量的主要指标.辅修课程.创新学分和第二课堂的学分和成绩不计入学分通过率和加权平均分的计算.创新学分和第二课堂是学生获得毕业资格的必要条件.理工类专业学生应修不少于4学分的创新学分,其他专业应修不少于2学分的创新学分.第二课堂应修满12学分. 同时,通过询问同学获取了在教务

软件工程 2016.7.5日报

软件工程 2016.7.5日报 今天我的主要工作是晚场了客户端功能的搭建.连接了客户端UI与客户端Socket部分的功能,为服务端增加了文件锁避免多个线程对同一文件同时操作. 具体实现的工作有: 客户端功能搭建: 在客户端完成了通信功能的实现: 补全了昨天空缺的代码,在收到消息时进行相应的处理: 1 if (arrMsg[0] == SEND_MSG) 2 { 3 ReceiveMsgFromServer(msgReceive); 4 } 5 else if (arrMsg[0] == IS_R

软件工程 2016.6.28 日报

今天,通过调查表的反馈明确了改进方向.作为组长,我负责整个项目的进度管理和质量控制,10天里的主要方向是: 1.不断进行新版本的需求分析从而明确组员行动方向 2.指导测试人员完成高质量的测试 3.撰写主要的文档 今天完成学习一些网络编程处理ip包方面的知识,对我们的平台拓展可能有一定的帮助. linux下ip头选项ipoption的实现(难以实现,setsockopt()函数不支持BSD标准下的IP_OPTION这一关键字) 在windows下 定义ipoptionhdr结构体 typedef

2016 1 9 日报

回忆自己这段时间的学习,最大的收获有2点,第一,差距在变小,第二,看到的自己的潜能. 自己的不足,学习能力一般,接受新鲜事物能力一般,思路比较发散,有时候想不清楚事情,就做了.这个需要尽快解决, 不过还好,这因为自己还不熟悉这个领域,接触了移动端和PC的框架以后,写了一些页面以后,其实现在好多问题都可以解决了. 比来之前的时候,好了太多,今天使用的框架并不复杂,今天遇到问题的逻辑也不突出,今天的事情也不是凌驾于我的能力之上, 只要努力的同学,都可以在这条路上,应该说任何领域走的很好,只要有足够的

2016年下半年项目管理师中高级报考说明

一.报考条件      亲,没有报考门槛,只要您年满18周岁就可.没有专业.职业和学历限制.二.需要购买哪些辅导资料    1.中高项的官方教材都是柳纯录老师主编的,中级考友最好买一本,高级考友无所谓.最好以张老师的课件为主.    2.张老师亲自编写了过关法宝系列资料,考试必备呀.三.培训效果怎样     合格率54%左右,其中,上午合格率84%左右,案例分析68%左右,论文80%左右.     论文押题神准--学员说的.      张老师的培训良心出品.四.我不是IT专业,也不从事IT岗位,

聊一聊前端模板与渲染那些事儿

欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): https://segmentfault.com/blog/frontenddriver 作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板.我们今天就来聊聊,拼装与渲染模板的那些事儿. 如果喜欢本文请点击右侧的推荐哦,你的推荐会变为我继续更文的动力 1 页面级的渲染 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串

使用 Raspberry Pi 上的传感器在 Node.js 中创建一个 IoT Bluemix 应用程序

先决条件 一个IBM Bluemix 帐号,一个 Raspberry Pi 2 或 3,一个 PIR 运动传感器 适用于本文的 Github 存储库 如果您是一位精明的 Bluemix 开发人员,您可能只想看看如何在 node.js 中与 IoT 建立连接,或者只想了解如何从此 github 存储库中拉取我的代码. git clone https://github.com/nicolefinnie/iot-nodejs-tutorial 以下是实现与 IBM IoT 平台连接在一起的 4 个 R