应用程序可以通过 TCPClient、TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务。这些协议类建立在 System.Net.Sockets.Socket 类的基础之上,负责数据传送的细节。(也就是说TCPClient、TCPListener 和 UDPClient 类是用来简化Socket) TcpClient 和 TcpListener 使用 NetworkStream 类表示网络。使用 GetStream 方法返回网络流,然后调用该流的 Read 和 Write 方法。NetworkStream 不拥有协议类的基础套接字,因此关闭它并不影响套接字。 UdpClient 类使用字节数组保存 UDP 数据文报。使用 Send 方法向网络发送数据,使用 Receive 方法接收传入的数据文报。 1.TcpClient using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net;
namespace tcpclient { class Program { private static int portNum = 11000; private static string hostName = Dns.GetHostName().ToString(); public static void Main(String[] args) { try { Console.WriteLine("主机名字:"+ Dns.GetHostName()); Console.WriteLine("主机IP地址:"+ Dns.GetHostAddresses(Dns.GetHostName())[0]); TcpClient client = new TcpClient(hostName, portNum); NetworkStream ns = client.GetStream(); byte[] bytes = new byte[1024]; int bytesRead = ns.Read(bytes, 0, bytes.Length); //将字节流解码为字符串 Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytesRead)); client.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); }
} } } 2.TcpListener Start 方法用来开始侦听传入的连接请求。Start 将对传入连接进行排队,直至您调用 Stop 方法或它已经完成 MaxConnections 排队为止。可使用 AcceptSocket 或 AcceptTcpClient 从传入连接请求队列提取连接。这两种方法将阻止。如果要避免阻止,可首先使用 Pending 方法来确定队列中是否有可用的连接请求。 调用 Stop 方法来关闭 TcpListener。 下面的例子给出怎么利用TcpListener监听客户端的请求: using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net; namespace tcpclient { class Program { private const int portNum = 11000; static void Main(string[] args) { bool done = false; //TcpListener listener = new TcpListener(portNum); //根据VS2005 MSDN 此方法已经过时,不再使用 // IPEndPoint类将网络标识为IP地址和端口号 TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Any, portNum)); listener.Start(); while (!done) { Console.Write("Waiting for connection..."); TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("Connection accepted."); NetworkStream ns = client.GetStream(); byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString()); try { ns.Write(byteTime, 0, byteTime.Length); ns.Close(); client.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } listener.Stop(); } } }
3.UdpClient · 使用远程主机名和端口号作为参数创建 UdpClient 类的实例。 · 创建 UdpClient 类的实例,然后调用 Connect 方法。 可以使用在 UdpClient 中提供的任何一种发送方法将数据发送到远程设备。使用 Receive 方法可以从远程主机接收数据。 下面的例子演示同一主机不同端口之间的UDP通信: 监听端: using System.Net.Sockets; using System.Text; using System.Net; using System.Threading; namespace Udpclient2 { class Program { static void Main(string[] args) { try { UdpClient udpClient = new UdpClient(12000); string returnData = "client_end"; do { Console.WriteLine("服务器端接收数据:............................."); IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); // 此处通过引用传值,获得客户端的IP地址及端口号 Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); //此处获得客户端的数据 returnData = Encoding.UTF8.GetString(receiveBytes); //Encoding.ASCII.GetString(receiveBytes); 此处若用ASCII,不能正确处理中文 Console.WriteLine("This is the message server received: " + returnData.ToString());
Thread.Sleep(3000);
Console.WriteLine("向客户端发送数据:............................."); udpClient.Connect(Dns.GetHostName().ToString(), 11000); // Sends a message to the host to which you have connected. string sendStr = "我来自服务器端:" + DateTime.Now.ToString(); Byte[] sendBytes = Encoding.UTF8.GetBytes(sendStr); //Byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr); 此处若用ASCII,不能正确处理中文 udpClient.Send(sendBytes, sendBytes.Length); Console.WriteLine("This is the message server send: " + sendStr);
} while (returnData != "client_end");
} catch (Exception e) { Console.WriteLine(e.ToString()); } } } }
客户端: using System.Net.Sockets; using System.Text; using System.Net; namespace Udpclient { class Program { static void Main(string[] args) { try { UdpClient udpClient = new UdpClient(11000);
//向服务器发送数据 udpClient.Connect(Dns.GetHostName().ToString(), 12000); // Sends a message to the host to which you have connected. string sendStr = "我来自客户端:" + DateTime.Now.ToString(); Byte[] sendBytes = Encoding.UTF8.GetBytes(sendStr); //Byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr); 此处若用ASCII,不能正确处理中文 udpClient.Send(sendBytes, sendBytes.Length); Console.WriteLine("This is the message client send: " + sendStr);
//等待服务器的答复,收到后显示答复,并结束对话 IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); // 此处通过引用传值,获得客户端的IP地址及端口号 Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); //此处获得服务器端的数据 string returnData = Encoding.UTF8.GetString(receiveBytes); //Encoding.ASCII.GetString(receiveBytes); 此处若用ASCII,不能正确处理中文 Console.WriteLine("This is the message come from server: " + returnData.ToString()); udpClient.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } } } |
socket与TcpListener/TcpClient/UdpClient 的区别及联系
最新推荐文章于 2023-12-04 17:09:51 发布