C#网络编程(1)

在这里插入图片描述
在这里插入图片描述

◆IP协议:网际协议(Internet Protocol)
◆TCP协议:
传输控制协议(Transmission Control Protocol)
◆UDP协议:用户数据协议(User Datagram Protocol)
◆IPX/SPX协议:互联网包交换协议-IPX,顺序分组交换协议-SPX
◆ATM协议:异步传输模式协议
Microsoft. Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System. Net和Syst em. Net. Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要-从socket 套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJyjYCUB-1599564375765)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20200907102601482.png)]

➢认识Socket
➢System Net. IPAddress: 提供网际协议(IP)地址
➢System Net. Sockets. TcpListener: 从TCP网络客户端侦听连接
➢System Net. Sockets. TcpClient: 为TCP网络服务提供客户端连接
➢System Net. IPEndPoint: 将网络端点表示为IP地址和端口号
➢System. Net. NetworkStream: 提供用于网络访问的基础数据流
➢Systemn. Net. Sockets. Socket: 实现Berkeley套接字接口
➢最原始的示例程序
➢小结
Socket原义为“插座" socket非常类似于电话插座。我们所见到的一切网络通讯程序基本上都基于socket来建设。在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket 正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有-个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客 户软件将插头插到不同编号的插座,就可以得到不同的服务。所谓socket通常也称作'套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。

System. Net. IPAddress :提供网际协议(IP)地址

主要方法: GetAddressBytes 以字节数组形式提供IPAddress的副本
		 IsLoopback回环地址判断
		 NetworkToHostOrder将数字由网络字节顺序转换为主机字节顺序
		 TryParse确定字符串是否为有效的IP地址
主要字段: Boradcase提供IP广播地址。255. 255. 255. 255
		 Loopback提供环回地址。127.0.0.1
主要属性: AddressFamily获取IP地址的地址族

System. Net. Sockets. TcpClient: 为TCP网络服务提供客户端连接

主要方法: BeginConnect 开始一个对远程主机连接的异步请求
		 Close 释放此TcpClient实例,而不关闭基础连接
	 	 Connect 使用指定的主机名和端口号将客户端连接到TCP主机
		 EndConnect 异步接受传入的连接尝试
主要属性: Active 状态值,是否已建立连接
		 Available 获取己经从网络接收且可供读取的数据量
		 Client 获职或设置基础Socket
		 Connected 用来指示TcpClient的基础Socket是否已连接到远程主机
		 ExclusiveAddressUse 状态值,用来指定TcpClient是否只允许一个客户端使用端口
	  	 RecevieBufferSize 获取或设置接收缓冲区的大小
		 ReciveTime0ut 获取或设置在初始化一个读取操作以后,TcpClient等待接收数据的时间量
		 SenBufferSize 获取或设置发送缓冲区的大小.
		 SendTime0ut 获取或设置TcpClient等待发送操作完成的时间量

System. Net. IPEndPoint:将网络端点表示为IP地址和端口号

主要方法: Create 从套接字地址创建终结点
主要字段: MaxPort 指定可以分配给Port属性的最大值。MaxPort值设置为00000FFFF。
		 MinPort 指定可以分配给Port属性的最小值
主要属性: Address 获取或设置终结点的IP地址
		 AddressFamily 获取网际协议(IP)地址簇
		 Port 获取或设置终点的端口号

System. Net. NetworkStream:提供用于网络访问的基础数据流

主要方法: BeginRead 从NetworkStream开始异步读取
	  	 BeginWrite 开始向流异步写入
		 EndRead 处理异步读取的结束
		 EndWrite 处理异步写入的结柬
		 Flush 刷新流中的数据。(保留此方法供将来使用)
		 Read 从NetworkStream读取数据
		 ReadByte 从流中读取一个字节,并将流内的位置推进一个字节,如果已达到末尾,则返回-1
		 Write 将数据写入NetworkStream
		 WriteByte 将一个字节写入流内的当前位置,并将流内的位置向前推进一个字节。
主要属性: CanRead 获取一个值,用来说明NetworkStream是否支持读取
		 CanTimeout 指示超时属性是否可用于NetworkStream
		 CanWrite 指示NetworkStream是否支持写入
		 DataAvaiable 指示要读取的NetworkStr eam上是否有可用的数据
		 Readable 指示NetworkStream是否可以读取
		 Socket 获取基础Socket
		 Writeable指示NetworkStream是否可写
		 WriteTimeOut获取或设置写入操作阻止等待数据的时间量

System. Net. Sockets. Socket:实现BerkeIey套接字接口 

主要方法: Accept 为新建连接创建新的Socket
		 AcceptAsync 开始一个异步操作来接受一个传入的连接尝试
		 BeginAccept 开始一个异步操作来接受一个传入的连接尝试
		 BeginConnect 开始一个远程主机连接的异步请求
		 BeginDisconnect 开始异步请求从远程终结点断开连接
		 BeginReceive 开始从连接的Socket中异步接收数据
		 BeginReceiveFrom 开始指定网络设备中异步接收数据
		 BeginReceiveMessageFrom 开始使用指定的SocketFlags将指定字节数的数据异步接收到数据缓冲区的指定位置,然后存储结点和数据包信息
		 BeginSend 将数据异步发送到连接的Socket
		 BeginSendFile 将文件异步发送到数据的Socket对象
		 BeginSendTo 向特定远程主机异步发送数据
		 Bind 使Socket与一个本地终点相关联
		 Close 关闭Socket连接并释放所有关联的资源
		 Connect 建立与远程主机的连接
		 ConnectAsync 开始一个对远程主机连接的异步请求
		 Disconnect 关闭套接字连接并允许重用套接字
		 DisconnectAsyne 开始异步请求从远程终结点断开连接
 		 Dispose 释放由Socket使用的非托管资源,并可根据需要释放托管资源
		 DuplicateAndClose 重复目标进程的套接字引用,并关闭此进程的套接字
		 EndAccept 异步接受传入的连接尝试
		 EndConnect 结束挂起的异步连接请求
		 EndDisconnect 结束挂起的异步断开连接请求
		 EndReceive 结束挂起的异步读取
		 EndReceiveFrom 结束挂起的、从特定终点进行异步读取
		 EndReceiveMessageFrom 结束挂起的、从特定结定进行异步读取。此方法还显示有关数据包而不是EndRece iveFrom的更多信息
		 EndSend 结束挂起的异步发送
		 EndSendFile 结束文件的挂起异步发送
		 EndSendTo 结束挂起的、向指定位置进行的异步发送
          GetSocketOption 返回Socket选项的值
          I0Control为Socket 设置低级别操作模式
          Listen 将Socket 置于侦听状态
          Pool 确定Socket 的状态
          Receive 接收来自绑定的Socket的数据
          ReceiveAsync 开始一个异步请求以便从连接的Socket对象中接收数据
          ReceiveFrom 接收数据报并存储源终结点
          ReceiveFromAsync 开始从指定网络设备中异步接收数据
          ReceiveMessageFromAsync 开始使用指定的SocketAsyncEventArgs. SocketFlags将指定字节数的数据异步接收到数据缓冲区的指定位置,并存储结点和数据包信息
          Select 确定一个或多个套接字的状态
          Send 将数据发送到数据的Socket
          SendAsync 将数据异步发送到连接的Socket对象
          SendFile 将文件和可选数据异步发送到连接的Socket
          SendPacketsAsync 将文件集合或者内存中的数据缓冲区以异步方法发送给连接的Socket对象
          SendTo 将数据发送到特定终点
          SendToAsync 向特定远程主机异点发送数据
          SetSocketOption 设置Socket选项
          Shutdown 禁用某Socket.上的发送和接收
主要属性: AddressFamily 获取Socket的地址族
          Available 获取已经从网络接收且可供读取的数据量
          Blocking 获取或设置一个值,该值指示Socket是否处于阻止模式
          Connected 获取一个值,指示Socket是在上次Send还是Receive操作时连接到远程主机
          DontFragment 指定Socket是否允许将Internet协议(IP)数据报分段
          EnableBroadCast 指定Socket是否可以发磅或接收广播数据包
          ExclusiveAddressUse 指定Socket是否公允许-个进程绑定到端口
          IsBound 指示Socket是否绑定到特定本地端口
          LingerState 指定Socket在尝试发送所有挂起数据时是否延迟关闭套接字
          LocalEndPoint 获取本地终结点
          MulticastLoopback 指定传出的多路广播数据包是否传递到发送应用程序
          ProtocolType 得到Socket的协议类型
          ReceiveBufferSize 指定Socket接收缓冲区的大小
          ReceiveTimeout 指定之后同步Receive调用将超时的时间长度
          RemoteEndPoint 得到远程终结点
          SendBufferSize 指定Socket发送缓冲区的大小
          SendTimeout 指定之后Send调用将超时的时间长度
          SocketType获取Socket的类型

客户机和服务器有什么区别

一个主动去连接,一个等待被连接

服务器:ConsoleSever

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace ConsoleSever
{
    class Program
    {
        static void Main(string[] args)
        {
            Int32 port = 5555;//设置连接方端口号
            IPAddress localAddr = IPAddress.Parse("127.0.0.1");//将字符串转为IPAddress实例
            byte[] byteReceive = new byte[256];//接收的报文流
            byte[] byteSend = null;//发送的报文流
            string strReceive = "";//接收的报文
            string strSend = "";//发送的报文
            bool bExit = false;//是否退出
            int length = 0;//报文的长度

            #region 服务器方式1,使用TcpClient、IPAddress、TcpListener和NetworkStream

           /* TcpListener server = null;//侦听tcp网络客户端的连接
            try
            {
                server = new TcpListener(localAddr, port);
                server.Start();//侦听连接请求
                Console.WriteLine("Info>>Wait for a Connection......");
                TcpClient client = server.AcceptTcpClient();//接受来自客户端的 挂起的 连接请求
                NetworkStream stream = client.GetStream();//得到用于发送和接收数据的流
                while (true)
                {
                    length = 0;
                    strReceive = "";
                    strSend = "";
                    while ((length = stream.Read(byteReceive, 0, byteReceive.Length)) > 0)//从流中读取数据到字节数组中,如果不为空,则将字符串中的占位符去掉并显示数据,然后输入并发送报文
                    {
                        strReceive = System.Text.Encoding.UTF8.GetString(byteReceive);//将字节数组解码为字符串
                        if (strReceive.IndexOf('\0') >= 0)//去除后面的空格
                        {
                            strReceive = strReceive.Remove(strReceive.IndexOf('\0'));
                        }
                        Console.WriteLine("info>>{0}", strReceive);//展示数据
                        strSend = "";
                        while (strSend == "")//写入不为空的发送数据
                        {
                            Console.Write("input>>");
                            strSend = Console.ReadLine();
                        }
                        if (strSend == "exit")//退出循环
                        {
                            client.Close();
                            bExit = true;
                            break;
                        }
                        else//发送报文
                        {
                            byteSend = Encoding.UTF8.GetBytes(strSend);//转成字节数组
                            stream.Write(byteSend, 0, byteSend.Length);//发送报文
                            Console.WriteLine("info>>Send OK!");
                        }
                        Array.Clear(byteReceive, 0, byteReceive.Length);//清空缓存
                    }
                    if (bExit)
                    {
                        break;
                    }
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("info>>ERROR:SocketException: {0}", e);
            }
            finally
            {
                server.Stop();
            }
            Console.WriteLine("info>>Press Enter Exit");
            Console.Read();*/

            #endregion

            #region 服务器方式2 IPEndPoint、IPAddress和Socket

            IPEndPoint point = new IPEndPoint(localAddr, port);//把ip和端口转化为IPEndPoint实例
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个套接字
            server.Bind(point);
            server.Listen(10);//挂起队列的最大长度
            Console.WriteLine("info>>Wait for a Connection......");
            Socket client = server.Accept();

            while ((length = client.Receive(byteReceive, byteReceive.Length, 0)) > 0)//从流中读取数据到字节数组中,如果不为空,则将字符串中的占位符去掉并发送数据
            {
                strReceive = System.Text.Encoding.UTF8.GetString(byteReceive);//将字节数组解码为字符串
                if (strReceive.IndexOf('\0') >= 0)//去掉后面的空格
                {
                    strReceive = strReceive.Remove(strReceive.IndexOf('\0'));
                }
                Console.WriteLine("info>>{0}", strReceive);//展示数据
                strSend = "";
                while (strSend == "")//写入不为空的发送数据
                {
                    Console.Write("input>>");
                    strSend = Console.ReadLine();
                }
                
                byteSend = Encoding.UTF8.GetBytes(strSend);
                //client.Send(byteSend, byteSend.Length, 0);
                client.Send(byteSend);//发送数据包
                Console.WriteLine("info>>Send OK!");
                Array.Clear(byteReceive, 0, byteReceive.Length);//清空缓存
            }
            server.Close();
            client.Close();

            #endregion
        }
    }
}

客户端:ConsoleClient

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Int32 port = 5555;//设置连接方端口号
            IPAddress ip = IPAddress.Parse("127.0.0.1");//将字符串转为IPAddress实例
            string strSend = null;//发送的报文
            string strRecive = null;//接收的报文
            byte[] byteSend = null;//发送的报文流
            byte[] byteRecive = new byte[256];//接收的报文流
            bool bExit = false;
            int length = 0;//报文的长度

            #region 客户机方式1 TcpClient、IPAddress和NetworkStream

            /*try
            {
                TcpClient client = new TcpClient(ip.ToString(), 5555);//连接到指定主机上的指定端口
                NetworkStream stream = client.GetStream();//获取流
                Console.Write("Input>>");
                strSend = Console.ReadLine();
                byteSend = Encoding.UTF8.GetBytes(strSend);
                stream.Write(byteSend, 0, byteSend.Length);//将数据写入流

                while((length = stream.Read(byteRecive, 0, byteRecive.Length)) != 0)//如果服务器端返回数据
                {
                    strRecive = Encoding.UTF8.GetString(byteRecive);//将字节数组解码为字符串
                    if (strRecive.IndexOf("\0") >= 0)//去除后面的空格
                    {
                        strRecive = strRecive.Remove( strRecive.IndexOf("\0") );
                    }
                    Console.WriteLine("info>>{0}", strRecive);//展示数据
                    strSend = "";
                    while(strSend == "")//写入不为空的发送数据
                    {
                        Console.Write("input>>");
                        strSend = Console.ReadLine();
                    }
                    byteSend = Encoding.UTF8.GetBytes(strSend);//将字符串转化为字节数组
                    stream.Write(byteSend, 0, byteSend.Length);//发送报文
                    Console.WriteLine("info>>Send Ok!");

                    Array.Clear(byteRecive, 0, byteRecive.Length);//清空缓存
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("info>>ERROR : {0}", e);
            }*/

            #endregion

            #region 客户机方式2 IPEndPoint、IPAddress和Socket

            IPEndPoint point = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个套接字
            Console.WriteLine("info>>Connecting......");
            socket.Connect(point);//连接到服务器

            try
            {
                Console.Write("Input>");
                strSend = Console.ReadLine();//获取待发送的报文
                byteSend = Encoding.UTF8.GetBytes(strSend);//转化为比特流
                socket.Send(byteSend, byteSend.Length, 0);//发送报文 报文 发送的长度 开始位置
                while (true)
                {
                    if ((length = socket.Receive(byteRecive, byteRecive.Length, 0)) > 0)//从服务器端接收返回的数据
                    {
                        strRecive = Encoding.UTF8.GetString(byteRecive);//将字节数组解码为字符串
                        if (strRecive.IndexOf("\0") >= 0)//去除后面的空格
                        {
                            strRecive = strRecive.Remove(strRecive.IndexOf("\0"));
                        }
                        Console.WriteLine("info>>{0}", strRecive);//展示数据
                        strSend = "";
                        while (strSend == "")//写入不为空的发送数据
                        {
                            Console.Write("input>>");
                            strSend = Console.ReadLine();
                        }
                        if (strSend == "exit")//退出循环
                        {
                            socket.Close();
                            bExit = true;
                            break;
                        }
                        byteSend = Encoding.UTF8.GetBytes(strSend);
                        socket.Send(byteSend, byteSend.Length, 0);//发送测试数据
                        Console.WriteLine("info>>Send Ok!");

                        Array.Clear(byteRecive, 0, byteRecive.Length);//清空缓存
                    }
                }
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("info>>ERROR : {0}", e);
            }
            catch (SocketException e)
            {
                Console.WriteLine("info>>ERROR : {0}", e);
            }
            finally
            {
                socket.Close();
            }

            #endregion

            Console.WriteLine("Input>>please input Enter...");
            Console.ReadLine();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值