当前位置: 56net亚洲必嬴 > 编程 > 正文

www.56.net:Socket网络通信

时间:2019-10-24 18:29来源:编程
网络编制程序 应用程序能够因而 TCPClient、TCPListener 和 UDPClient 类使用传输调节左券(TCP) 和客户数量文报契约 (UDP) 服务。这个公约类建立在System.Net.Sockets.Socket类的底子之上,担负数据传

网络编制程序

应用程序能够因而 TCPClient、TCPListener 和 UDPClient 类使用传输调节左券(TCP) 和客户数量文报契约 (UDP) 服务。这个公约类建立在 System.Net.Sockets.Socket 类的底子之上,担负数据传送的内情。(也正是说TCPClient、TCPListener 和 UDPClient 类是用来简化Socket)

TCPServer:

        使用C#开展互联网编制程序时,平日都必要用到System.Net命名空间、System.Net.Sockets命名空间和System.Net.Mail命名空间;

TcpClient 和 TcpListener 使用 NetworkStream 类表示网络。使用 GetStream 方法重回网络流,然后调用该流的 Read 和 Write 方法。NetworkStream 不抱有公约类的功底套接字,由此关闭它并不影响套接字。

TCP 网络顾客端侦听连接。

1. System.Net命名空间:为前段时间网络上行使的有余议和提供了简易的编制程序接口。

UdpClient 类使用字节数组保存 UDP 数据文报。使用 Send 方法向网络发送数据,使用 Receive 方法选取传入的多少文报。

可使用 TcpClient 或 Socket 来连接 TcpListener。可采取IPEndPoint、本地 IP 地址及端口号或许仅使用端口号,来成立 TcpListener。能够将地面 IP 地址钦命为 Any,将当地端口号内定为 0(若是希望基础服务提供程序为您分配那一个值)。假如你选取如此做,可在连接套接字后接收LocalEndpoint 属性来标记已钦赐的音讯。

  1. DNS类:DNS是一个静态类,它从Internet域名系统(DNS)检索有关特定主机的新闻,在IPHostEntry类的实例中回到来自DNS查询的主机消息。(GetHostName()找到本地系统的主机名,然后再用GetHostByName()找到主机的IP地址)
  2. IPAddress类:包蕴计算机在IP网络上的地点,主要用于提供网际公约(IP)地址。
  3. IPEndPoint类满含应用程序连接到主机上的服务所要求的主机和地点或远程端口新闻。首要用于将互连网端点表示为IP地址和端口号。
  4. WebClient类:提供向U景逸SUVL标记的其余地方、Intranet或Internet财富发送数据以致从那些财富选拔数据的共用措施。
  5. WebRequest类:.Net Framework的伸手/响应模型的聊以自慰基类,用于访问Internet数据。使用该乞求/响应模型的应用程序能够用公约不可以看到的不二等秘书籍从Internet需要数据。

1.TcpClient

Start 方法用来早先侦听传入的连接央浼。Start 将对传播连接举办排队,直至您调用 Stop 方法或它早就到位 马克斯Connections 排队截止。可使用 AcceptSocket 或 AcceptTcpClient 从传播连接央浼队列提取连接。那三种方式将截留。假诺要制止阻止,可首先使用 Pending 方法来分明队列中是或不是有可用的接连必要。

2. System.Net.Sockets命名空间

TcpClient 类提供了风流倜傥部分简练的方式,用于在联名阻止方式下通过互联网来连接、发送和选择流数据。为使 TcpClient 连接并交换数据,使用 TCP ProtocolType 成立的 TcpListener 或 Socket 必需侦听是不是有传出的接连央求。能够接纳上面三种格局之接二连三接到该侦听器:

 bool done = false;
            //TcpListener listener = new TcpListener(portNum); //依照VS贰零零柒 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[] tempBuffer = new byte[4096];
                FileStream fs = File.Open("D:\tcpServer"+new Random().Next().ToString() + ".gif", FileMode.CreateNew);
                int bytesRead = 0;
                do
                {
                    bytesRead = ns.Read(tempBuffer, 0, 4096);
                    fs.Write(tempBuffer, 0, bytesRead);
                }while (bytesRead > 0);
                
                fs.Close();
                client.Close();
                Console.WriteLine("file accepted.");               
            }
            listener.Stop();

        首要提供制作Sockets网络应用程序的连锁类,当中Socket类,TcpClient类、TcpListener类和UdpClient类较为常用。在.NET框架下支付时,间接运用System.Net.Sockets名称空间中的Socket类编制程序较为复杂,而应用层的类TcpClient、TcpListener 和 UdpClient为 Socket 通讯提供了更简便易行、对客商更温馨的接口。它们和Socket类之间的这种档次关系如图

(1)创制三个 TcpClient,并调用多少个可用的 Connect 方法之生机勃勃。

TCPClient:

www.56.net 1

(2)使用远程主机的主机名和端口号创制TcpClient。此构造函数将自行尝试四个连连。

TcpClient 为 TCP 互联网服务提供客商端连接。

(1)Socket类:第风流倜傥用于管理总是(将应用程序与端口连接起来,端口是生龙活虎台计算机的多寡都经过此一连互联网, Socket是基于流套接字公约(TCP左券)/基于数据报套接字公约(UDP合同)最为通用的API。),达成Berkeley通讯端套接字接口,同临时间它还定义了绑定、连接网络端点及传输数据所需的各样方法。

给前者的验证要发送和采用数据,请使用 GetStream 方法来赢得一个NetworkStream。调用 NetworkStream 的 Write 和 Read 方法与长途主机之间发送和选择数据。使用 Close 方法释放与 TcpClient 关联的兼具财富。

TcpClient 类提供了风流倜傥部分简易的艺术,用于在一同阻塞形式下通过网络来一连、发送和接纳流数据。

    1. void Bind(IPEndPoint localEP):绑定地址,使Socket与三个地面终节点相关联。
    2. Void Connect(IPEndPoint ip):营造连接
    3. Void Listen(int backlog):将Socket置于侦听状态, backlog最多可连接数。
    4. Int Receive(byte[] buffer):接受数据
    5. Int Receive (byte[] buffer,ref IPEndPoint ip):从钦点地点接纳数据
    6. Int Send(byte[] buffer):发送数据
    7. Int Send To(byte[] buffer,ref IPEndPoint remoteIP):向钦命地方发送数据
    8. Void Shutdown(SocketShutdown how):关闭套接字,how内定不在允许奉行的操作

上面包车型地铁事例给出怎么使用TcpClient连选拔服务器:

为使 TcpClient 连接并沟通数据,使用 TCP ProtocolType 创建的 TcpListenerSocket 必需侦听是不是有传播的连天央浼。可以行使上面三种办法之三翻五次接到该侦听器:

注:使用accept函数建构新的连接时,并非利用原本的Socket进行通讯,而是再次来到二个新的Socket套接字举办连接通信。原本的Socket继续进入监听状态,等待外人的连年必要。

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

  • 开创一个 TcpClient,并调用多个可用的 Connect 方法之风流倜傥。
  • 行使远程主机的主机名和端口号创立 TcpClient。此构造函数将自行尝试三个连连。

(2)TcpClient类:传闻Socket类创设,用于在一块阻止形式下通过互联网来三翻五次,发送,接受数据。

2.TcpListener

注意   借使要在生龙活虎道阻塞格局下发送无连接数据报,请使用 UdpClient 类。

        这是它能够以越来越高的肤浅程度提供TCP服务的功底。体以往互连网数据的发送和接受地点,是TcpClient使用NetworkStream网络流管理技巧,使得它读写多少进一步惠及直观。TcpClient类专为顾客端设计,它为 TCP 互连网服务提供客商端连接。

TcpListener 类提供一些简约方法,用于在阻拦同步方式下侦听和收受传入连接供给。可接收TcpClient 或 Socket 来连接 TcpListener。可选拔 IPEndPoint、本地 IP 地址及端口号只怕仅使用端口号,来创制 TcpListener。能够将本地 IP 地址钦定为 Any,将本地端口号钦点为 0(假设期望基础服务提供程序为你分配那么些值)。假诺您接收这么做,可在连接套接字后使用 LocalEndpoint 属性来标记已钦赐的音讯。

对前面一个的证实:  要发送和选用数据,请使用 GetStream 方法来收获三个 NetworkStream。调用 NetworkStreamWriteRead 方法与远程主机之间发送和选拔数据。使用 Close 方法释放与 TcpClient 关联的有着财富。

(3)NetworkStream网络流:能够被视为三个数据通道,架设在数码来源端(客户Client)和采纳端(服务Server)之间,通过TcpClient.GetStream方法,重回用于发送和选取数据的互连网流NetworkStream。

Start 方法用来开首侦听传入的接连几天央求。Start 将对传播连接实行排队,直至您调用 Stop 方法或它早就做到 马克斯Connections 排队结束。可利用 AcceptSocket 或 AcceptTcpClient 从传播连接伏乞队列提取连接。那二种办法将堵住。假诺要防止阻止,可首先接纳Pending 方法来分明队列中是不是有可用的连续几日央浼。

 

        注:要创造NetworkStream必需提供连接的Socket.暗中认可意况下关闭NetworkStream并不会关闭所提供的Socket.假诺要关闭Socket权限,则必得将ownsSocket构造函数参数的值钦命为true.而后的数量读取及写入均指向这几个通道来开展。不扶植对互连网流的妄动访问。

调用 Stop 方法来关闭 TcpListener。

//第一步:读取文件
            Console.WriteLine("本程序实现向服务器发送文件...");
            FileStream fs = File.Open("D:\xml\ok.png", FileMode.Open);
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, (int)fs.Length);
            fs.Close();

身体力行如下:通过以下方法获得NetworkStream网络流之后,就足以应用标准流读写方法Write和Read来发送和担任多少了。

上边包车型客车例子给出怎么利用TcpListener监听顾客端的伏乞:

            //第二步:发送文书
www.56.net,            try
            {
                TcpClient client = new TcpClient(System.Net.Dns.GetHostName(), portNum);
                NetworkStream ns = client.GetStream();
                ns.Write(buffer, 0, buffer.Length);
                ns.Close();
                client.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

1 TcpClient tcpClient = new TcpClient();             //创建TcpClient对象实例
2 tcpClient.Connect("www.baidu.com",4088);         //尝试与远程主机相连
3 NetworkStream stream=tcpClient.GetStream();      //获取网络传输流

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); //依照VS二零零六 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();
         }
    }
}

 

  1. BeginRead():从NetworkStream开首一步读取
  2. BeginWrite():先导向流异步写入
  3. Close():关闭NetworkStream
  4. EndRead():管理异步读取结束
  5. EndWrite():管理异步写入截止
  6. Flush():刷新流中的数码
  7. Read():从流中读取
  8. ReadByte():从流中读取三个字节,并将流内的职位向前带动叁个字节。到达最终,重临-1。
  9. Write():将数据写入NetworkStream
  10. WriteByte():将一个字节写入流内的一时一刻地点,并将流内的职位向前推动一个字节。

3.UdpClient

Server:获取基础互联网Socket

UdpClient 类提供了某个简约的措施,用于在阻拦同步方式下发送和吸收接纳无连接 UDP 数据报。因为 UDP 是无连接传输合同,所以无需在发送和选拔数据前创建远程主机连接。但你可以筛选使用上边三种办法之一来创建暗中认可远程主机:

编辑:编程 本文来源:www.56.net:Socket网络通信

关键词: