博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Socket的三个功能类TCPClient、TCPListener 和 UDPClient (转)
阅读量:6512 次
发布时间:2019-06-24

本文共 5538 字,大约阅读时间需要 18 分钟。

应用程序可以通过 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     TcpClient 类提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。为使 TcpClient 连接并交换数据,使用 TCP 创建的 或 必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器:    (1)创建一个 TcpClient,并调用三个可用的 方法之一。    (2)使用远程主机的主机名和端口号创建 TcpClient。此构造函数将自动尝试一个连接。     给继承者的说明要发送和接收数据,请使用 方法来获取一个 。调用 NetworkStream 的 和 方法与远程主机之间发送和接收数据。使用 方法释放与 TcpClient 关联的所有资源。

    下面的例子给出怎么利用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    TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。可使用 或 来连接 TcpListener。可使用 、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 ,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。如果您选择这样做,可在连接套接字后使用 属性来标识已指定的信息。

    方法用来开始侦听传入的连接请求。Start 将对传入连接进行排队,直至您调用 方法或它已经完成 MaxConnections 排队为止。可使用 或 从传入连接请求队列提取连接。这两种方法将阻止。如果要避免阻止,可首先使用 (注:TcpListener类才有)方法来确定队列中是否有可用的连接请求。

调用 Stop 方法来关闭 TcpListener。

下面的例子给出怎么利用TcpListener监听客户端的请求: using System;

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 类提供了一些简单的方法,用于在阻止同步模式下发送和接收无连接 UDP 数据报。因为 UDP 是无连接传输协议,所以不需要在发送和接收数据前建立远程主机连接。但您可以选择使用下面两种方法之一来建立默认远程主机:

·         使用远程主机名和端口号作为参数创建 UdpClient 类的实例。

·         创建 UdpClient 类的实例,然后调用 方法。

   可以使用在 UdpClient 中提供的任何一种发送方法将数据发送到远程设备。使用 方法可以从远程主机接收数据。    UdpClient 方法还允许发送和接收多路广播数据报。使用 方法可以将 UdpClient 预订给多路广播组。使用 方法可以从多路广播组中取消对 UdpClient 的预订。

   下面的例子演示同一主机不同端口之间的UDP通信:

监听端: using System;

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;

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());

            }

        }

    }

}

转载于:https://www.cnblogs.com/bile/p/3606043.html

你可能感兴趣的文章
大家好,新年快乐。
查看>>
labview如何弹出提示窗口_LabVIEW开发者必读的问答汇总,搞定疑难杂症全靠它了!...
查看>>
mysql批量数据多次查询数据库_mysql数据库批量操作
查看>>
jquery 乱码 传参_jquery获取URL中参数解决中文乱码问题的两种方法
查看>>
JDBC_MySQL_jdbc连接mysql_MySQL
查看>>
java ftpclient 代码_java后台代码ftpclient下载文件
查看>>
linux不能访问80端口,lunux开放80端口(本地访问不了linux文件可能是这个原因)...
查看>>
android单位转换小程序,微信小程序中rpx与rem单位转换
查看>>
ps切图教程 android,PS前端切图完整教程
查看>>
HTML如何把输入框变成必填值,required输入框为必填项
查看>>
背锅侠逆袭之路
查看>>
演示:使用协议分析器取证IPv6的报文结构
查看>>
oracle 11gr2 rac中的4种IP解说
查看>>
为什么你找不到工作?
查看>>
汇编语言的应用
查看>>
device platform 相应的表
查看>>
php des 加密解密实例
查看>>
【Mac】Mac键盘实现Home, End, Page UP, Page DOWN
查看>>
实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求
查看>>
安德鲁斯----多媒体编程
查看>>