软件工程 2016.6.30 日报

软件工程 2016.6.30 日报



今天主要学习的内容是C# socket网络编程中的TCP通讯技术。socket编程的原理如下:

  在服务端的处理流程为:

    (1)建立服务器端的Socket,开始侦听整个网络中的连接请求。

    (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。

    (3)当完成通信后,服务器关闭与客户端的Socket连接。

  在服务端的处理流程为:

    (1)建立客户端的Socket,确定要连接的服务器的主机名和端口。

    (2)发送连接请求到服务器,并等待服务器的回馈信息。

    (3)连接成功后,与服务器进行数据的交互。

    (4)数据处理完毕后,关闭自身的Socket连接。

  我自己也写了一个小的demo完成简单的通信工作,同时将前天学习的多线程的知识也结合到了demo中,实现了多线程的socket通信。

  服务器端核心的代码如下:

  1      #region ----------     开启服务器     ----------
  2         /// <summary>
  3         ///     开启服务器
  4         /// </summary>
  5         public void StartServer()
  6         {
  7             //创建负责监听的套接字,参数使用IPv4寻址协议,使用流式连接,使用TCP协议传输数据
  8             socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  9
 10             //创建一个绑定IP和port的网络节点对象
 11             IPAddress ipAddress = IPAddress.Parse(ipAddr);
 12             IPEndPoint endPoint = new IPEndPoint(ipAddress, port);
 13
 14             try
 15             {
 16                 //将监听socket绑定到创建的网络节点
 17                 socketWatch.Bind(endPoint);
 18
 19                 //设置监听等待队列的长度
 20                 socketWatch.Listen(20);
 21
 22                 //创建负责监听的线程,并传入监听方法
 23                 threadWatch = new Thread(WatchConnection);
 24                 //设置为后台线程
 25                 threadWatch.IsBackground = true;
 26                 //开启线程
 27                 threadWatch.Start();
 28
 29                 return;
 30             }
 31             catch (SocketException se)
 32             {
 33                 Console.WriteLine("【错误】" + se.Message);
 34                 return;
 35             }
 36             catch (Exception e)
 37             {
 38                 Console.WriteLine("【错误】" + e.Message);
 39                 return;
 40             }
 41         }
 42         #endregion
 43
 44         /// <summary>
 45         ///     监听客户端请求
 46         /// </summary>
 47         private void WatchConnection()
 48         {
 49             //持续监听请求
 50             while (true)
 51             {
 52                 Socket socketConnection = null;
 53                 try
 54                 {
 55                     //监听请求,如果有新请求则返回一个socket
 56                     socketConnection = socketWatch.Accept();
 57                     string socketKey = socketConnection.RemoteEndPoint.ToString();
 58
 59
 60                     //将每个新产生的socket存起来,以客户端IP:端口作为key
 61                     dictSocket.Add(socketKey, socketConnection);
 62
 63                     Console.WriteLine("用户IP : {0} 已连接...", socketKey);
 64
 65                     //为每个服务端通信socket创建一个单独的通信线程,负责调用通信socket的Receive方法,监听客户端发来的数据
 66                     //创建通信线程
 67                     Thread threadCommunicate = new Thread(ReceiveMsg);
 68                     threadCommunicate.IsBackground = true;
 69                     threadCommunicate.Start(socketConnection);
 70
 71                     dictThread.Add(socketKey, threadCommunicate);
 72
 73                 }
 74                 catch (SocketException se)
 75                 {
 76                     Console.WriteLine("【错误】" + se.Message);
 77                     return;
 78                 }
 79                 catch (Exception e)
 80                 {
 81                     Console.WriteLine("【错误】" + e.Message);
 82                     return;
 83                 }
 84             }
 85         }
 86         #endregion
 87
 88         /// <summary>
 89         ///     服务端监听客户发来的数据
 90         /// </summary>
 91         private void ReceiveMsg(object socketClientPara)
 92         {
 93             Socket socketClient = socketClientPara as Socket;
 94
 95             while (true)
 96             {
 97                 // 定义一个接收消息用的缓冲区
 98                 byte[] msgReceiver = new byte[1024 * 1024 * 2];
 99
100                 // 接收消息的长度
101                 int length = -1;
102
103                 try
104                 {
105                     length = socketClient.Receive(msgReceiver);
106                 }
107                 catch (SocketException se)
108                 {
109                     string socketKey = socketClient.RemoteEndPoint.ToString();
110                     Console.WriteLine("【错误】" + socketKey + " 接收消息异常 错误信息:" + se.Message);
111                 }
112                 catch (Exception e)
113                 {
114                     Console.WriteLine("【错误】" + e.Message);
115                     return;
116                 }
117                  string sendMsg = Encoding.UTF8.GetString(msgReceiver, 0, length);
118                  Console.WriteLine("收到:{0}", sendMsg) ;
119       }120    }

  客户端的核心代码如下:

 1 #region ----------    开启客户机    ----------
 2         /// <summary>
 3         ///     开启客户端
 4         /// </summary>
 5         public void StartClient()
 6         {
 7             //创建一个绑定IP和port的网络节点对象
 8             IPAddress ipAddress = IPAddress.Parse(ipAddr);
 9             IPEndPoint endPoint = new IPEndPoint(ipAddress, port);
10
11             socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
12
13             try
14             {
15                 //连接服务器
16                 socketClient.Connect(endPoint);
17
18                 threadClient = new Thread(ReceiveMsg);
19                 threadClient.IsBackground = true;
20                 threadClient.Start();
21             }
22             catch (SocketException se)
23             {
24                 Console.WriteLine("【错误】连接服务器异常:" + se.Message);
25                 return;
26             }
27             catch (Exception e)
28             {
29                 Console.WriteLine("【错误】连接服务器异常:" + e.Message);
30                 return;
31             }
32         }
33         #endregion
34
35         #region ----------     接收消息     ----------
36         /// <summary>
37         ///     接收消息
38         /// </summary>
39         private void ReceiveMsg()
40         {
41             while (true)
42             {
43                 // 定义一个缓冲区保存接收的消息
44                 byte[] arrMsg = new byte[1024 * 1024 * 2];
45
46                 // 保存数据长度
47                 int length = -1;
48
49                 try
50                 {
51                     // 获取信息
52                     length = socketClient.Receive(arrMsg);
53
54                     // 解析字符串
55                     string msgReceive = Encoding.UTF8.GetString(arrMsg);
56
57                     Console.WriteLine("收到:{0}",msgReceive);
58                 }
59                 catch (SocketException se)
60                 {
61                     Console.WriteLine("【错误】接收消息异常:" + se.Message);
62                     return;
63                 }
64                 catch (Exception e)
65                 {
66                     Console.WriteLine("【错误】接收消息异常:" + e.Message);
67                     return;
68                 }
69             }
70         }
71         #endregion
72
73         #region ----------     发送消息     ----------
74         public void SendMsg(string msg)
75         {
76             byte[] arrMsg = Encoding.UTF8.GetBytes(msg);
77
78             try
79             {
80                 socketClient.Send(sendArrMsg);
81
82                 Console.WriteLine("我:{0}", msg);
83             }
84             catch (SocketException se)
85             {
86                 Console.WriteLine("【错误】发送消息异常:" + se.Message);
87                 return;
88             }
89             catch (Exception e)
90             {
91                 Console.WriteLine("【错误】发送消息异常:" + e.Message);
92                 return;
93             }
94
95         }

  我将写好的两个程序分别在同一局域网下的两台机子上跑,能够成功实现通信,这为后续进一步扩展功能,实现吐槽墙奠定了一定的基础。

时间: 2024-10-12 23:28:35

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

软件工程 2016.7.3 日报

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

软件工程 2016.7.4日报

软件工程 2016.7.4日报 今天我进行的主要工作包括了完成服务器端功能的搭建,以及客户端socket通信功能架构的搭建以及部分功能的实现. 对服务器端,在周五的时候我对于接受消息.处理消息部分的功能还没有实现,今天将代码补全,构建出了一个较完善的服务端代码. 今天具体实现的代码如下: 主要实现了检查本地是否包含用户所上的全部课程的聊天室,返回特定聊天室的聊天记录给用户,向特定聊天室记录文件中添加吐槽,以及移除在线好友,处理非法信息等. 在实现的过程中运用的主要技术包括C#文件操作.JSON封

软件工程 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/6/30

软件工程个人日报 2016/6/30 今天我主要学习了C#WPF的Canvas和总体构想了一下新增的吐槽墙功能的实现UI设计. Canvas为容器控件,用于定位,并可以通过Visibility属性控制是否显示Canvas中的内容.通过使用Canvas控件,我可以在一个窗口里切换不同界面,完成吐槽墙界面与成绩查询界面的转换. 例如: <Canvas x:Name="userRegisterCanvas" Margin="5,5,580,400" Visibili

个人日志-2016.6.30

姓名 刘鑫 时间 2016.6.30 学习内容 1.   小组汇报工作和讨论 2.   学习使用百度API离线地图 添加所需要的jar包: i 在application中添加开发密钥: <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="WqnqPEMenRrCOiF7nrDhHdkKfipidIr7" />     添加所需权限: 所遇问题 错误原因:包中没有出现的 2.错

市面上未见FRI.Device.Rating.Program.V3.0.0.742+PipeFlow.Expert.2016.v7.30专业

FRI.Device.Rating.Program.V3.0.0.742美国精馏公司开发的化工软件     美国精馏公司开发的化工软件,市面上未见,会员拥有,可用于塔板(筛板, 浮阀)的严格的水力学计算   这是一个重大的改革,将使更多的DRP可持续升级程序.周五是规划的重大改进,继续为我们的会员提供价值. DLL转换项目成员的批准以便未来修改的新模型和功能添加DRP.QQ:16264558      TEL:13963782271   在DRP 3,计算引擎(DLL)进行了简化,并重新编写的C

2016.10.30 对时间的感悟

2016.10.30 对时间的感悟 时间的单位是什么,年,月日,时,分秒? 对于我们来说时间应该是这辈子,然后被我们 切割成一个个时间段,这很有意思, 其实我想说, 有时候我们感觉来不及, 我们很烦躁, 我们快乐不起来, 可能是因为我们没有在自己规定的时间段完成规定的目标, 我们希望小孩上好的学校, 希望工资高点, 希望今天公安局办理身份证的人员有上班等等, 当我们完不成目标的时候就会有各种不良反应, 不是说有目标不好,有目标是很好的,这没毛病, 问题是我们在不够了解这个世界的规则的情况下常常高