首頁 > 軟體

C#之Socket(通讯端)通讯

2022-05-13 21:11:32

一、socket是什么

Socket是应用层与TCP/IP协定族通讯的中间软体抽象层,它是一组介面。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协定族隐藏在Socket介面后面,对用户来说,一组简单的介面就是全部,让Socket去组织资料,以符合指定的协定。所以,我们无需深入理解tcp/udp协定,socket已经为我们封装好了,我们只需要遵循socket的规定去程式设计,写出的程式自然就是遵循tcp/udp标准的。

二、通讯端的工作流程

先从伺服器端说起。伺服器端先初始化Socket,然后与埠系结(bind),对埠进行监听(listen),呼叫accept阻塞,等待用户端连线。在这时如果有个用户端初始化一个Socket,然后连线伺服器(connect),如果连线成功,这时用户端与伺服器端的连线就建立了。用户端传送资料请求,伺服器端接收请求并处理请求,然后把回应资料传送给用户端,用户端读取资料,最后关闭连线,一次互动结束。

三、伺服器端

private void btnListen_Click(object sender, EventArgs e)
{
    IPEndPoint point = new IPEndPoint(IPAddress.Any, 13000);//IPAddress.Any本机任何网络卡IP。本机埠检视netstat -an
    //伺服器端Socket定义
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    socket.Bind(point); //系结IP
    socket.Listen(10);//启动监听。最大监听数,同一个时间点过来10个用户端,排队
    ShowMsg("伺服器开始监听");

    Thread thread = new Thread(AcceptInfo);
    thread.Start(socket);

}

//记录通讯用的Socket
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();

// private Socket client;
void AcceptInfo(object o)
{
    Socket socket = o as Socket;
    while (true)
    {
        //通讯用socket
        try
        {
            Socket clientSocket = socket.Accept();//如果用户端有请求,生成一个新的Socket
            string point = clientSocket.RemoteEndPoint.ToString();
            ShowMsg(point + "连线用户端成功!");
            dic.Add(point, clientSocket);
            //接收讯息
            Thread th = new Thread(ReceiveMsg);
            th.Start(clientSocket);
        }
        catch (Exception ex)
        {
            break;
        }
    }
    socket.Close();
}
//接收讯息
void ReceiveMsg(object socket)
{
    Socket clientSocket = socket as Socket;
    while (true)
    {
        //接收用户端传送过来的资料
        try
        {
            //定义byte阵列存放从用户端接收过来的资料
            byte[] buffer = new byte[1024 * 1024];
            
           int n = clientSocket.Receive(buffer);//将接收过来的资料放到buffer中,并返回实际接受资料的长度

            //将位元组转换成字串
            string words = Encoding.Unicode.GetString(buffer, 0, n);
            Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":" + words);
            byte[] msg = Encoding.Unicode.GetBytes(words);
            clientSocket.Send(msg);//传送资料,位元组阵列
        }
        catch (Exception ex)
        {
            break;
        }
    }
    clientSocket.Shutdown(SocketShutdown.Both);//禁止传送和接受资料
    clientSocket.Close();//关闭socket,释放资源
}

四、用户端

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint("127.0.0.1", 13000));//连线到的伺服器端IP
clientSocket.Connect(point);//连线到伺服器
ShowMsg("连线成功");
ShowMsg("伺服器" + client.RemoteEndPoint.ToString());
ShowMsg("用户端:" + client.LocalEndPoint.ToString());
Thread th = new Thread(ReceiveMsg);//连线成功后,就可以接收伺服器传送的资讯了
th.IsBackground = true;
th.Start();

clientSocket.Shutdown(SocketShutdown.Both);//禁止传送和接受资料
clientSocket.Close();//关闭socket,释放资源

五、Socket物件的成员

1、属性

名称说明
AddressFamily获取 Socket 的地址族。
Available获取已经从网路接收且可供读取的资料量。
Blocking获取或设定一个值,该值指示 Socket 是否处于阻止模式。
Connected获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连线到远端主机。
Handle获取 Socket 的作业系统控制代码。
LocalEndPoint获取本地终结点。
RemoteEndPoint获取远端终结点。
ProtocolType获取 Socket 的协定型别。
SocketType获取 Socket 的型别。
ReceiveBufferSize获取或设定一个值,它指定 Socket 接收缓冲区的大小。
ReceiveTimeout获取或设定一个值,该值指定之后同步 Receive 呼叫将超时的时间长度。
SendBufferSize获取或设定一个值,该值指定 Socket 传送缓冲区的大小。
SendTimeout获取或设定一个值,该值指定之后同步 Send 呼叫将超时的时间长度。

2、方法

Accept

名称说明
Accept()为新建连线建立新的 Socket。
BeginAccept(AsyncCallback, Object)  开始一个非同步操作来接受一个传入的连线尝试。
EndAccept(Byte[], IAsyncResult)非同步接受传入的连线尝试,并建立新的 Socket 物件来处理远端主机通讯。 此方法返回包含所传输的初始资料的缓冲区。
AcceptAsync(SocketAsyncEventArgs) 开始一个非同步操作来接受一个传入的连线尝试。

Connect

名称说明
Connect(EndPoint)与远端主机建立连线。
BeginConnect(EndPoint, AsyncCallback, Object)开始一个对远端主机连线的非同步请求。
EndConnect(IAsyncResult)结束挂起的非同步连线请求。
ConnectAsync(SocketAsyncEventArgs)开始一个对远端主机连线的非同步请求。

Disconnect

名称说明
Disconnect(Boolean)关闭通讯端连线并允许重用通讯端。
BeginDisconnect(Boolean, AsyncCallback, Object)开始非同步请求从远端终结点断开连线。
EndDisconnect(IAsyncResult)结束挂起的非同步断开连线请求。
DisconnectAsync(SocketAsyncEventArgs)关闭通讯端连线并允许重用通讯端。

Receive

名称说明
Receive(Byte[])从系结的 Socket 通讯端接收资料,将资料存入接收缓冲区。
BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)开始从连线的 Socket 中非同步接收资料。
EndReceive(IAsyncResult)结束挂起的非同步读取。
ReceiveAsync(SocketAsyncEventArgs)开始一个非同步请求以便从连线的 Socket 物件中接收资料。

ReceiveFrom

名称说明
ReceiveFrom(Byte[], EndPoint)将资料包接收到资料缓冲区并储存终结点。
BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始从指定网路装置中非同步接收资料。
EndReceiveFrom(IAsyncResult, EndPoint)结束挂起的、从特定终结点进行非同步读取。
ReceiveFromAsync(SocketAsyncEventArgs)开始从指定网路装置中非同步接收资料。

ReceiveMessageFrom

名称说明
ReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, IPPacketInformation)使用指定的 SocketFlags 将指定位元组数的资料接收到指定的资料缓冲区位置,并储存终结点和封包资讯。
BeginReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)开始使用指定的 SocketFlags 将指定位元组数的资料非同步接收到资料缓冲区的指定位置,然后储存终结点和封包资讯。
EndReceiveMessageFrom(IAsyncResult, SocketFlags, EndPoint, IPPacketInformation)结束挂起的、从特定终结点进行非同步读取。 此方法还显示有关封包而不是 EndReceiveFrom(IAsyncResult, EndPoint) 的更多资讯。
ReceiveMessageFromAsync(SocketAsyncEventArgs)开始使用指定的 SocketFlags 将指定位元组数的资料非同步接收到资料缓冲区的指定位置,并储存终结点和封包资讯。

Send

名称说明
Send(Byte[])将资料传送到连线的 Socket。
BeginSend(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)将资料非同步传送到连线的 Socket。
EndSend(IAsyncResult)结束挂起的非同步传送。
SendAsync(SocketAsyncEventArgs)将资料非同步传送到连线的 Socket 物件。

SendFile

名称说明
SendFile(String)使用 Socket 传输标志,将档案 fileName 传送到连线的 UseDefaultWorkerThread 物件。
BeginSendFile(String, AsyncCallback, Object)使用 Socket 标志,将档案 fileName 传送到连线的 UseDefaultWorkerThread 物件。
EndSendFile(IAsyncResult)结束档案的挂起非同步传送。

SendTo

名称说明
SendTo(Byte[], EndPoint)将资料传送到指定的终结点。
BeginSendTo(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object)以非同步方式将资料传送到特定远端主机。
EndSendTo(IAsyncResult)结束挂起的、向指定位置进行的非同步传送。
SendToAsync(SocketAsyncEventArgs)以非同步方式将资料传送到特定远端主机。

其它

名称说明
Select(IList, IList, IList, Int32)确定一个或多个通讯端的状态。
SendPacketsAsync(SocketAsyncEventArgs)将档案集合或者记忆体中的资料缓冲区以非同步方法传送给连线的 Socket 物件。
Bind(EndPoint)使 Socket 与一个本地终结点相关联。
Listen(Int32)将 Socket 置于侦听状态。
CancelConnectAsync(SocketAsyncEventArgs)取消一个对远端主机连线的非同步请求。
GetSocketOption(SocketOptionLevel, SocketOptionName)返回指定的 Socket 选项的值,表示为一个物件。
SetSocketOption(SocketOptionLevel, SocketOptionName, Boolean)将指定的 Socket 选项设定为指定的 Boolean 值。
SetIPProtectionLevel(IPProtectionLevel)设定通讯端的 IP 保护级别。
Shutdown(SocketShutdown)禁用某 Socket 上的传送和接收。
Close()关闭 Socket 连线并释放所有关联的资源。
Dispose()释放 Socket 类的当前范例所使用的所有资源。

到此这篇关于C#之Socket(通讯端)通讯的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com