C# Socket系列一 简单的创建socket的监听
socket的應(yīng)用場(chǎng)景,在快速,穩(wěn)定,保持長(zhǎng)連接的數(shù)據(jù)傳輸代碼。Http也是socket封裝出來(lái)的,基于一次請(qǐng)求一次回復(fù),然后斷開(kāi)的socket連接封裝。
比如我們常見(jiàn)的游戲服務(wù)器,目前的很火的物聯(lián)網(wǎng)服務(wù)器,都需要開(kāi)啟socket服務(wù)器去監(jiān)聽(tīng)實(shí)時(shí)傳輸?shù)臄?shù)據(jù)。
那么我們?nèi)绾螌?shí)現(xiàn)socket的監(jiān)聽(tīng)呢。說(shuō)到這里,我們需要知道,socket的監(jiān)聽(tīng)分為tcp和udp兩種形式,但是tcp其實(shí)是udp封裝而來(lái)的,可看做可靠的udp傳輸,基于udp的定向傳輸,收到消息回復(fù)發(fā)送方收到消息。等驗(yàn)證,來(lái)實(shí)現(xiàn)tcp的數(shù)據(jù)傳輸,所以一般我們tcp的傳輸相對(duì)udp稍微慢一點(diǎn)。
我們先將一下socket 的tcp狀態(tài)創(chuàng)建一個(gè)TCPListener類(lèi)
/// <summary>/// 建立TCP通信監(jiān)聽(tīng)服務(wù)/// </summary>internal class TCPListener{private IPEndPoint _IP;private Socket _Listeners;private volatile bool IsInit = false;private List<TSocketBase> sockets = new List<TSocketBase>();/// <summary>/// 初始化服務(wù)器/// </summary>public TCPListener(string ip = "0.0.0.0", int port = 9527){IsInit = true;IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(ip), port);this._IP = localEP;try{Console.WriteLine(string.Format("Listen Tcp -> {0}:{1} ", ip, port));this._Listeners = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);this._Listeners.Bind(this._IP);this._Listeners.Listen(5000);SocketAsyncEventArgs sea = new SocketAsyncEventArgs();sea.Completed += new EventHandler<SocketAsyncEventArgs>(this.AcceptAsync_Async);this.AcceptAsync(sea);}catch (Exception ex){Console.WriteLine(ex);this.Dispose();}}private void AcceptAsync(SocketAsyncEventArgs sae){if (IsInit){if (!this._Listeners.AcceptAsync(sae)){AcceptAsync_Async(this, sae);}}else{if (sae != null){sae.Dispose();}}}private void AcceptAsync_Async(object sender, SocketAsyncEventArgs sae){if (sae.SocketError == SocketError.Success){var socket = new TSocketClient(sae.AcceptSocket);sockets.Add(socket);Console.WriteLine("Remote Socket LocalEndPoint:" + sae.AcceptSocket.LocalEndPoint + " RemoteEndPoint:" +sae.AcceptSocket.RemoteEndPoint.ToString());}sae.AcceptSocket = null;if (IsInit){this._Listeners.AcceptAsync(sae);}else{sae.Dispose();}}/// <summary>/// 釋放資源/// </summary>public void Dispose(){if (IsInit){IsInit = false;this.Dispose(true);GC.SuppressFinalize(this);}}/// <summary>/// 釋放所占用的資源/// </summary>/// <param name="flag1"></param>protected virtual void Dispose([MarshalAs(UnmanagedType.U1)] bool flag1){if (flag1){if (_Listeners != null){try{Console.WriteLine(string.Format("Stop Listener Tcp -> {0}:{1} ", this.IP.Address.ToString(),this.IP.Port));_Listeners.Close();_Listeners.Dispose();}catch{}}}}/// <summary>/// 獲取綁定終結(jié)點(diǎn)/// </summary>public IPEndPoint IP{get { return this._IP; }}}主要兩點(diǎn)我們socket的初始化代碼?new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);初始化的類(lèi)型是基于tcp。
還有就是我們綁定ip地址,過(guò)去很多人socket的bind地址習(xí)慣寫(xiě)成127.0.0.1(測(cè)試環(huán)境)或者讀取網(wǎng)卡信息,讀取ip地址,這樣麻煩,代碼要寫(xiě)很多,切不符合多網(wǎng)卡多線路實(shí)際環(huán)境。我們用0.0.0.0是表示開(kāi)啟ipv4的所有線路監(jiān)聽(tīng),包括你的多路網(wǎng)卡,以及127.0.0.1
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 TCPListener tcp = new TCPListener(); 6 Console.ReadLine(); 7 } 8 }我們運(yùn)行看一下效果
接下來(lái)我們使用telnet測(cè)試一下
開(kāi)啟telnet
然后打開(kāi)cmd?
輸入 telnet 127.0.0.1 9527
我們看到收到了一個(gè)連接
總結(jié)
以上是生活随笔為你收集整理的C# Socket系列一 简单的创建socket的监听的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 农行透支卡解读 办理条件和使用渠道一览
- 下一篇: C# Socket系列二 简单的创建 s