国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#TCP Socket網絡編程(異步通信方式)

2019-11-09 17:12:48
字體:
來源:轉載
供稿:網友

一、Socket編程

Socket即為套接字,它其實是一個句柄,存在于內存中的一個標識符,作為網絡通信的一個符號。

Socket類位于System.Net.Sockets命名空間,封裝了與套接字編程相關的API,其內部調用了與WInsock相關的WIn32 API。

網絡通信至少有兩個通信終端,一般來說,監聽并接受連續的一端稱為服務器,而發送請求的一方稱為客戶端。

二、Socket類的使用步驟

1、服務器

(1)實例化Socket對象。

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, PRotocolType.Tcp);

(2)調用Bind方法綁定本地終結點。需要指定一個本地ip地址和一個本地端口,Socket將在該終結點上監聽傳入的客戶端連接。(注意綁定餓端口號必須為系統暫未分配的,否則指定端口號無效,無法建立連接)

IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 8622);server.Bind(endpoint);

(3)調用Listen方法開始監聽客戶端連接。

server.Listen(15);

(4)調用Accept相關方法接收連接,并返回一個用于與客戶端進行通信的Socket實例。

server.BeginAccept(new AsyncCallback(Accpcallback), server);
private static void Accpcallback(IAsyncResult ar)        {            Socket server = (Socket)ar.AsyncState;            Socket client = server.EndAccept(ar);            string remoteendpoint = client.RemoteEndPoint.ToString();            Console.WriteLine("已接受客戶端【0】的連接。" + remoteendpoint);            byte[] data = Encoding.UTF8.GetBytes("您好,服務器已經接受連接了。");            int len = data.Length;            client.Send(BitConverter.GetBytes(len));            client.Send(data);            client.Close();            Console.ReadLine();            server.BeginAccept(new AsyncCallback(Accpcallback), server);        }(5)通過Send方法和Recieve方法進行收發數據。

(6)通信結束后調用Close關閉Socket對象。

2、客戶端

(1)實例化Socket。

Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

(2)調用Connect方法進行連接,需要指定服務器的地址和端口,服務器的端口必須與服務器綁定的監聽端口一致,否則無法連接。

client.Connect("127.0.0.1", 8622);(3)調用Send和Recieve方法收發數據。對于未進行連接的Socket對象,可以使用RecieveFrom和SendTo來進行通信。

(4)通信結束后關閉Socket對象。

3、連接示意圖

三、服務器,客戶端源代碼

客戶端:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;namespace tcpclient{    class Program    {        static void Main(string[] args)        {            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            try            {                client.Connect("127.0.0.1", 8622);                string remoteendpoint = client.RemoteEndPoint.ToString();                Console.WriteLine("成功連接服務器【0】。" + remoteendpoint);                byte[] buffer = new byte[4];                client.Receive(buffer);                int len = BitConverter.ToInt32(buffer, 0);                buffer = new byte[len];                client.Receive(buffer);                string msg = Encoding.UTF8.GetString(buffer);                Console.WriteLine("從服務器接收到消息:/n" + msg);                Console.ReadLine();            }            catch (SocketException ex)            {                Console.WriteLine(ex.Message);            }        }    }}服務器

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;namespace tcpserver{    class Program    {        static void Main(string[] args)        {                        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 8622);            server.Bind(endpoint);            server.Listen(15);            server.BeginAccept(new AsyncCallback(Accpcallback), server);            Console.ReadLine();        }        private static void Accpcallback(IAsyncResult ar)        {            Socket server = (Socket)ar.AsyncState;            Socket client = server.EndAccept(ar);            string remoteendpoint = client.RemoteEndPoint.ToString();            Console.WriteLine("已接受客戶端【0】的連接。" + remoteendpoint);            byte[] data = Encoding.UTF8.GetBytes("您好,服務器已經接受連接了。");            int len = data.Length;            client.Send(BitConverter.GetBytes(len));            client.Send(data);            client.Close();            Console.ReadLine();            server.BeginAccept(new AsyncCallback(Accpcallback), server);        }    }}

源碼下載地址:

http://download.csdn.net/detail/kevin_iot/9749747

注意:以上為兩個項目,必須兩個項目全部運行才能完成客戶端與服務端的連接

如何同時建立兩個項目?在已有的項目基礎上,右鍵解決方案,新建新的項目。

如何同時運行多個項目?打開解決方案屬性窗口,把啟動方式改為“多啟動項目”,并且將兩個項目都標記為“啟動”。

如何驗證程序的執行步驟?設置斷電,一步步執行,看執行步驟是否為示意圖所示。

運行結果

參考文章:

C#網絡編程基本字段——IPAddress、IPEndPoint

C#編程筆記

C#Socket簡單例子(服務器與客戶端通信)

參考書籍:

C#6.0 學習筆記


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鹤峰县| 金秀| 竹溪县| 北辰区| 高邮市| 黔江区| 锦屏县| 甘肃省| 庄浪县| 丰原市| 鄢陵县| 昌平区| 武隆县| 休宁县| 东辽县| 宿迁市| 天津市| 中山市| 铜梁县| 九台市| 宝兴县| 麦盖提县| 曲靖市| 长汀县| 贵州省| 镇赉县| 海安县| 勃利县| 芦山县| 乐都县| 通许县| 贵定县| 辽宁省| 宜宾市| 鄂尔多斯市| 司法| 阿巴嘎旗| 高陵县| 和平县| 凤山县| 加查县|