C#网络通信:TCP连接

开发 后端
TCP连接的特点是连接一直存在,即建立连接后可以随时传输数据,直至断开连接为止。本文主要介绍了C#网络通信中的TCP连接步骤。

基本原理:TCP连接的特点是连接一直存在,即建立连接后可以随时传输数据,直至断开连接为止。TCP连接有着明确的服务器和客户端的分工,因此需要分别编程处理。

网络通信用到的命名空间:

  1. using System.Net;  
  2. using System.Net.Sockets; 

C#网络通信:TCP连接第一步——获取服务器的IP地址

当然您可以通过ipconfig等方式查询作为服务器的计算机的IP地址,这里介绍通过C#语句获取的方法。

  1. private String GetIPAddress()  
  2.  {  
  3.      String str;  
  4.      String Result = "";  
  5.      String hostName = Dns.GetHostName();  
  6.      IPAddress[] myIP = Dns.GetHostAddresses(hostName);  
  7.      foreach (IPAddress address in myIP)  
  8.      {  
  9.          str = address.ToString();  
  10.          for (int i = 0; i <  str.Length; i++)  
  11.          {  
  12.              if (str[i] >= '0' && str[i] < = '9' || str[i] == '.') Result = str;  
  13.          }  
  14.      }  
  15.      return Result;  
  16.  } 

红色的部分是核心的语句,获取的是一组IP地址,存储在 IPAddress[] myIP 中。这组IP地址包含物理(依次输出下就会发现),但我们最常用的是32位的IP地址,因此编写了这个方法进行筛选。

C#网络通信:TCP连接第二步——服务器建立监听

  1. IPAddress ipa = IPAddress.Parse("192.168.1.100");  
  2.  
  3. TcpListener myListener = new TcpListener(ipa, 8080);  
  4.  
  5. myListener.Start(); 

红色的部分是服务器的IP地址和要开放的端口号,视具体情况而定。端口号为整型。

C#网络通信:TCP连接第三步——客户端请求连接

  1. TcpClient tclient = new TcpClient();  
  2.  
  3. tclient.Connect("192.168.1.100", 8080); 

如果客户端请求连接时服务器并未开启监听,则会抛出 SocketException 异常。所以一是要确保服务器开启监听了再请求连接,二是应该把这两行代码放入到try-catch里面,以便连接不成功时程序不会崩溃。

C#网络通信:TCP连接第四步——服务器应答

  1. Socket mySocket = myListener.AcceptSocket(); 

服务器将连接绑定给mySocket,以后和客户端的通信都通过mySocket来完成。

但这里需要注意,如果执行该语句时没有客户端请求连接,则会进入无尽的等待,使程序出现“未响应”的状态。因此Socket的下面这个方法将极为有用:

  1. if (myListener.Pending())  
  2. {  
  3.        Socket mySocket = myListener.AcceptSocket();  
  4.   } 

Pending()的作用是“确定是否有挂起的连接请求”,如果有则返回true。这样以来就实现了有请求时才去接受,再配合WinForm的Timer组件使用,可以达到很好的效果。

至此,连接工作已完成。总结一下,只有第三步是客户端的代码,其余都是服务器的代码。

C#网络通信:TCP连接第五步——发送数据和接收数据

1.服务器发送:

  1. mySocket.Send(Encoding.Unicode.GetBytes("要发送的内容")); 

2.服务器接收:

  1. byte[] data = new byte[1024];  
  2.  if (mySocket.Available > 0)  
  3. {  
  4. mySocket.Receive(data);  
  5. String content = Encoding.Unicode.GetString(data);  

3.客户端发送:

  1. NetworkStream ns = tclient.GetStream();  
  2.  
  3. String content = "要发送的内容";  
  4.  
  5. byte[] data = Encoding.Unicode.GetBytes(content);  
  6.  
  7.  ns.Write(data, 0, data.Length); 

4.客户端接受:

  1. if (tclient.Available > 0)  
  2. {  
  3. byte[] data = new byte[1024];  
  4. ns.Read(data, 0, 1024);  
  5. String content = Encoding.Unicode.GetString(data);  

服务器使用Send和Receive方法,客户端使用NetworkStream流。其中 mySocket.Available > 0 和 tclient.Available > 0 的作用与 myListener.Pending() 的作用相同,都是先判断是否有数据可读再进行读取,否则也会失去响应。Encoding.Unicode的方法用于字符串和字节数组间的转换,因为网络中的数据是以字节传输的。接收数据时也可以使用Timer来达到更好的效果。

【编辑推荐】

  1. C#控制台应用程序的基本结构
  2. C#编程:使用迭代器
  3. 浅谈C#泛型的定义、继承、方法和约束
  4. C++和C#相互调用COM组件的方法简介
  5. 如何实现C#代理(Delegate)
责任编辑:book05 来源: hi.baidu
相关推荐

2019-04-29 10:26:49

TCP网络协议网络通信

2019-09-02 10:20:27

TCPIP协议

2019-10-22 08:11:43

Socket网络通信网络协议

2012-12-21 09:19:29

Google GO

2021-12-09 16:48:25

鸿蒙HarmonyOS应用

2012-09-24 15:13:50

C#网络协议TCP

2020-11-12 08:52:16

Python

2024-02-20 19:53:57

网络通信协议

2022-12-05 09:25:17

Kubernetes网络模型网络通信

2023-09-18 13:12:00

TCPUDP

2009-08-21 14:47:39

C#网络编程

2010-06-09 11:31:55

网络通信协议

2016-08-25 11:17:16

CaaS华为

2022-05-13 10:59:14

容器网络通信

2009-10-16 08:48:08

2010-04-22 16:10:48

Aix操作系统网络通信

2019-09-25 08:25:49

RPC网络通信

2021-08-30 13:08:56

Kafka网络通信

2010-06-14 19:13:28

网络通信协议

2010-06-29 10:15:31

局域网故障
点赞
收藏

51CTO技术栈公众号