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