日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

你得学会并且学得会的Socket编程基础知识

發(fā)布時(shí)間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你得学会并且学得会的Socket编程基础知识 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這一篇文章,我將圖文并茂地介紹Socket編程的基礎(chǔ)知識(shí),我相信,如果你按照步驟做完實(shí)驗(yàn),一定可以對(duì)Socket編程有更好地理解。

本文源代碼,可以通過這里下載?http://files.cnblogs.com/chenxizhang/SocketWorkshop.rar

?

第一步:創(chuàng)建解決方案

第二步:創(chuàng)建服務(wù)端程序

這里可以選擇“Console Application”這個(gè)類型,比較方便調(diào)試

然后編寫如下代碼,實(shí)現(xiàn)服務(wù)器的基本功能

using System; using System.Collections.Generic; using System.Linq; using System.Text;//額外導(dǎo)入的兩個(gè)命名空間 using System.Net.Sockets; using System.Net;namespace SocketServer {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)新的Socket,這里我們使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//將該socket綁定到主機(jī)上面的某個(gè)端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//啟動(dòng)監(jiān)聽,并且設(shè)置一個(gè)最大的隊(duì)列長(zhǎng)度//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);Console.WriteLine("Server is ready!");Console.Read();}} }

?

現(xiàn)在可以啟動(dòng)調(diào)試一下看看效果如何,正常情況下應(yīng)該會(huì)看到一個(gè)提示,因?yàn)槲覀冃枰赥CP 4530端口進(jìn)行監(jiān)聽,所以防火墻會(huì)有提示。

點(diǎn)擊“Allow access”

這樣,我們的服務(wù)器就可以開始監(jiān)聽了。但是這有什么用呢?是的,沒有什么用。

我們還需要為服務(wù)器添加一些功能,例如接受傳入的請(qǐng)求,給客戶端發(fā)送消息,或者從客戶端接收消息等等

第三步:接受傳入的請(qǐng)求

我們需要通過Accept,或者(BeginAccept)來(lái)接受傳入的請(qǐng)求,請(qǐng)注意下面代碼中的紅色部分

?

using System; using System.Collections.Generic; using System.Linq; using System.Text;//額外導(dǎo)入的兩個(gè)命名空間 using System.Net.Sockets; using System.Net;namespace SocketServer {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)新的Socket,這里我們使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//將該socket綁定到主機(jī)上面的某個(gè)端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//啟動(dòng)監(jiān)聽,并且設(shè)置一個(gè)最大的隊(duì)列長(zhǎng)度//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4); //開始接受客戶端連接請(qǐng)求//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspxsocket.BeginAccept(new AsyncCallback((ar) =>{//這就是客戶端的Socket實(shí)例,我們后續(xù)可以將其保存起來(lái)var client = socket.EndAccept(ar);//給客戶端發(fā)送一個(gè)歡迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));}), null);Console.WriteLine("Server is ready!");Console.Read();}} }

?

wow,看起來(lái)不錯(cuò)對(duì)吧,我們趕緊做一個(gè)客戶端來(lái)測(cè)試一下吧

?

第四步:創(chuàng)建客戶端

我們還是使用一個(gè)Console Application

添加如下的代碼,并且創(chuàng)建客戶端連接

using System; using System.Collections.Generic; using System.Linq; using System.Text;//導(dǎo)入的命名空間 using System.Net.Sockets;namespace SocketClient {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)Socketvar socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//連接到指定服務(wù)器的指定端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspxsocket.Connect("localhost", 4530);Console.WriteLine("connect to the server");Console.Read();}} }

依次選擇SocketServer和SocketClient這兩個(gè)項(xiàng)目,分別將其啟動(dòng)為調(diào)試狀態(tài)(右鍵菜單,Debug=>Start new instance)

我們看到兩個(gè)程序都工作正常。

但是,在客戶端怎么沒有收到服務(wù)器發(fā)過來(lái)的消息呢?那是因?yàn)?#xff0c;我們沒有在客戶端提供這方面的功能。

?

第五步:在客戶端中實(shí)現(xiàn)接受消息的方法

using System; using System.Collections.Generic; using System.Linq; using System.Text;//導(dǎo)入的命名空間 using System.Net.Sockets;namespace SocketClient {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)Socketvar socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//連接到指定服務(wù)器的指定端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspxsocket.Connect("localhost", 4530);//實(shí)現(xiàn)接受消息的方法 var buffer = new byte[1024];//設(shè)置一個(gè)緩沖區(qū),用來(lái)保存數(shù)據(jù)//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspxsocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback((ar) =>{//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//讀取出來(lái)消息內(nèi)容var message = Encoding.Unicode.GetString(buffer, 0, length);//顯示消息Console.WriteLine(message);}), null);Console.WriteLine("connect to the server");Console.Read();}} }

請(qǐng)注意以上紅色的部分,我們用了BeginReceive方法進(jìn)行異步的消息偵聽,如果收到了,我們就打印出來(lái)

看起來(lái)已經(jīng)實(shí)現(xiàn)了我們需求了:服務(wù)器給客戶端發(fā)了一個(gè)消息,而客戶端也已經(jīng)收到了。

但是,這遠(yuǎn)遠(yuǎn)不夠,因?yàn)樗鼈冎g的通訊不僅僅是一次性的,那么如果服務(wù)器要不斷地給客戶端發(fā)消息,例如每隔兩秒鐘就發(fā)送一個(gè)消息,如何實(shí)現(xiàn)呢?

?

第六步:實(shí)現(xiàn)服務(wù)器定期向客戶端發(fā)消息

using System; using System.Collections.Generic; using System.Linq; using System.Text;//額外導(dǎo)入的兩個(gè)命名空間 using System.Net.Sockets; using System.Net;namespace SocketServer {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)新的Socket,這里我們使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//將該socket綁定到主機(jī)上面的某個(gè)端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//啟動(dòng)監(jiān)聽,并且設(shè)置一個(gè)最大的隊(duì)列長(zhǎng)度//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);//開始接受客戶端連接請(qǐng)求//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspxsocket.BeginAccept(new AsyncCallback((ar) =>{//這就是客戶端的Socket實(shí)例,我們后續(xù)可以將其保存起來(lái)var client = socket.EndAccept(ar);//給客戶端發(fā)送一個(gè)歡迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString())); //實(shí)現(xiàn)每隔兩秒鐘給服務(wù)器發(fā)一個(gè)消息//這里我們使用了一個(gè)定時(shí)器var timer = new System.Timers.Timer();timer.Interval = 2000D;timer.Enabled = true;timer.Elapsed += (o, a) =>{client.Send(Encoding.Unicode.GetBytes("Message from server at " +DateTime.Now.ToString()));};timer.Start();}), null);Console.WriteLine("Server is ready!");Console.Read();}} }

?

我們還要實(shí)現(xiàn)在客戶端一直監(jiān)聽消息的機(jī)制,而不是一次性接收.請(qǐng)注意下面紅色的部分

?

using System; using System.Collections.Generic; using System.Linq; using System.Text;//導(dǎo)入的命名空間 using System.Net.Sockets;namespace SocketClient {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)Socketvar socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//連接到指定服務(wù)器的指定端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspxsocket.Connect("localhost", 4530);Console.WriteLine("connect to the server");//實(shí)現(xiàn)接受消息的方法//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage),socket);Console.Read();} static byte[] buffer = new byte[1024];public static void ReceiveMessage(IAsyncResult ar){try{var socket = ar.AsyncState as Socket;//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//讀取出來(lái)消息內(nèi)容var message = Encoding.Unicode.GetString(buffer, 0, length);//顯示消息Console.WriteLine(message);//接收下一個(gè)消息(因?yàn)檫@是一個(gè)遞歸的調(diào)用,所以這樣就可以一直接收消息了)socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);}catch(Exception ex){Console.WriteLine(ex.Message);}}} }

重新調(diào)試起來(lái),看起來(lái)的效果如下圖所示

我們繼續(xù)做下面的實(shí)驗(yàn),一步一步地研究Socket通訊中可能遇到的一些問題

請(qǐng)先關(guān)閉掉客戶端這個(gè)程序,而不要關(guān)閉服務(wù)端程序,這時(shí)會(huì)發(fā)現(xiàn)一個(gè)錯(cuò)誤

這個(gè)錯(cuò)誤很容易理解,因?yàn)榭蛻舳艘呀?jīng)關(guān)閉,也就是客戶端那個(gè)Socket已經(jīng)不存在了,服務(wù)器還繼續(xù)向它發(fā)送消息當(dāng)然會(huì)出錯(cuò)。所以,從可靠性方面的考慮,我們必須在發(fā)送消息之前檢測(cè)Socket的活動(dòng)狀態(tài)

?

第七步:檢測(cè)客戶端的活動(dòng)狀態(tài)

using System; using System.Collections.Generic; using System.Linq; using System.Text;//額外導(dǎo)入的兩個(gè)命名空間 using System.Net.Sockets; using System.Net;namespace SocketServer {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)新的Socket,這里我們使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//將該socket綁定到主機(jī)上面的某個(gè)端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//啟動(dòng)監(jiān)聽,并且設(shè)置一個(gè)最大的隊(duì)列長(zhǎng)度//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);//開始接受客戶端連接請(qǐng)求//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspxsocket.BeginAccept(new AsyncCallback((ar) =>{//這就是客戶端的Socket實(shí)例,我們后續(xù)可以將其保存起來(lái)var client = socket.EndAccept(ar);//給客戶端發(fā)送一個(gè)歡迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));//實(shí)現(xiàn)每隔兩秒鐘給服務(wù)器發(fā)一個(gè)消息//這里我們使用了一個(gè)定時(shí)器var timer = new System.Timers.Timer();timer.Interval = 2000D;timer.Enabled = true;timer.Elapsed += (o, a) =>{ //檢測(cè)客戶端Socket的狀態(tài)if(client.Connected){try{client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));}catch(SocketException ex){Console.WriteLine(ex.Message);}}else{timer.Stop();timer.Enabled = false;Console.WriteLine("Client is disconnected, the timer is stop.");}};timer.Start();}), null);Console.WriteLine("Server is ready!");Console.Read();}} }

上面代碼的邏輯很清楚,但有時(shí)候還是會(huì)觸發(fā)那個(gè)SocketException。為什么呢?這是因?yàn)槲覀兊腡imer是每隔兩秒鐘檢查一次,那么就很可能有一種情況,我們檢查的時(shí)候,它還是連接狀態(tài),消息發(fā)出去之后,它斷開了。這種情況肯定是存在的。所以要用Try..catch的結(jié)構(gòu)

?

目前我們實(shí)現(xiàn)的場(chǎng)景很簡(jiǎn)單,服務(wù)器只管發(fā)消息,客戶端只管收消息。但實(shí)際工作中,可能希望服務(wù)器和客戶端都能收發(fā)消息。請(qǐng)看下一節(jié)

?

第八步:實(shí)現(xiàn)雙向收發(fā)消息

先看服務(wù)端的修改

?

using System; using System.Collections.Generic; using System.Linq; using System.Text;//額外導(dǎo)入的兩個(gè)命名空間 using System.Net.Sockets; using System.Net;namespace SocketServer {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)新的Socket,這里我們使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//將該socket綁定到主機(jī)上面的某個(gè)端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//啟動(dòng)監(jiān)聽,并且設(shè)置一個(gè)最大的隊(duì)列長(zhǎng)度//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);//開始接受客戶端連接請(qǐng)求//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspxsocket.BeginAccept(new AsyncCallback((ar) =>{//這就是客戶端的Socket實(shí)例,我們后續(xù)可以將其保存起來(lái)var client = socket.EndAccept(ar);//給客戶端發(fā)送一個(gè)歡迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));//實(shí)現(xiàn)每隔兩秒鐘給服務(wù)器發(fā)一個(gè)消息//這里我們使用了一個(gè)定時(shí)器var timer = new System.Timers.Timer();timer.Interval = 2000D;timer.Enabled = true;timer.Elapsed += (o, a) =>{//檢測(cè)客戶端Socket的狀態(tài)if(client.Connected){try{client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));}catch(SocketException ex){Console.WriteLine(ex.Message);}}else{timer.Stop();timer.Enabled = false;Console.WriteLine("Client is disconnected, the timer is stop.");}};timer.Start(); //接收客戶端的消息(這個(gè)和在客戶端實(shí)現(xiàn)的方式是一樣的)client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveMessage),client);}), null);Console.WriteLine("Server is ready!");Console.Read();} static byte[] buffer = new byte[1024];public static void ReceiveMessage(IAsyncResult ar){try{var socket = ar.AsyncState as Socket;//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//讀取出來(lái)消息內(nèi)容var message = Encoding.Unicode.GetString(buffer, 0, length);//顯示消息Console.WriteLine(message);//接收下一個(gè)消息(因?yàn)檫@是一個(gè)遞歸的調(diào)用,所以這樣就可以一直接收消息了)socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);}catch(Exception ex){Console.WriteLine(ex.Message);}}} }

可以看出來(lái),為了讓服務(wù)器可以接受消息,其實(shí)并不需要什么特別的設(shè)計(jì),與客戶端接受消息其實(shí)可以是一樣的

?

再來(lái)看看客戶端的修改

using System; using System.Collections.Generic; using System.Linq; using System.Text;//導(dǎo)入的命名空間 using System.Net.Sockets;namespace SocketClient {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)Socketvar socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//連接到指定服務(wù)器的指定端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspxsocket.Connect("localhost", 4530);Console.WriteLine("connect to the server");//實(shí)現(xiàn)接受消息的方法//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspxsocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); //接受用戶輸入,將消息發(fā)送給服務(wù)器端while(true){var message = "Message from client : " + Console.ReadLine();var outputBuffer = Encoding.Unicode.GetBytes(message);socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);}}static byte[] buffer = new byte[1024];public static void ReceiveMessage(IAsyncResult ar){try{var socket = ar.AsyncState as Socket;//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//讀取出來(lái)消息內(nèi)容var message = Encoding.Unicode.GetString(buffer, 0, length);//顯示消息Console.WriteLine(message);//接收下一個(gè)消息(因?yàn)檫@是一個(gè)遞歸的調(diào)用,所以這樣就可以一直接收消息了)socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);}catch(Exception ex){Console.WriteLine(ex.Message);}}} }

我在這里做了一個(gè)死循環(huán),用戶可以不斷地輸入,這些消息會(huì)被發(fā)送給服務(wù)器。如下圖所示

【備注】因?yàn)榉?wù)器每隔兩秒鐘會(huì)發(fā)送新消息過來(lái),所以在輸入的時(shí)候,動(dòng)作要稍快一點(diǎn)啦

?

本文最后探討一個(gè)問題,就是如何讓我們的服務(wù)器可以支持多個(gè)客戶端

?

第九步:支持多個(gè)客戶端

這個(gè)步驟只需要修改服務(wù)端程序即可

using System; using System.Collections.Generic; using System.Linq; using System.Text;//額外導(dǎo)入的兩個(gè)命名空間 using System.Net.Sockets; using System.Net;namespace SocketServer {class Program{/// <summary>/// Socket Server 演示/// 作者:陳希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//創(chuàng)建一個(gè)新的Socket,這里我們使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//將該socket綁定到主機(jī)上面的某個(gè)端口//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//啟動(dòng)監(jiān)聽,并且設(shè)置一個(gè)最大的隊(duì)列長(zhǎng)度//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);//開始接受客戶端連接請(qǐng)求//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);Console.WriteLine("Server is ready!");Console.Read();} public static void ClientAccepted(IAsyncResult ar){var socket = ar.AsyncState as Socket;//這就是客戶端的Socket實(shí)例,我們后續(xù)可以將其保存起來(lái)var client = socket.EndAccept(ar);//給客戶端發(fā)送一個(gè)歡迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));//實(shí)現(xiàn)每隔兩秒鐘給服務(wù)器發(fā)一個(gè)消息//這里我們使用了一個(gè)定時(shí)器var timer = new System.Timers.Timer();timer.Interval = 2000D;timer.Enabled = true;timer.Elapsed += (o, a) =>{//檢測(cè)客戶端Socket的狀態(tài)if(client.Connected){try{client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));}catch(SocketException ex){Console.WriteLine(ex.Message);}}else{timer.Stop();timer.Enabled = false;Console.WriteLine("Client is disconnected, the timer is stop.");}};timer.Start();//接收客戶端的消息(這個(gè)和在客戶端實(shí)現(xiàn)的方式是一樣的)client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);//準(zhǔn)備接受下一個(gè)客戶端請(qǐng)求socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);}static byte[] buffer = new byte[1024];public static void ReceiveMessage(IAsyncResult ar){try{var socket = ar.AsyncState as Socket;//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//讀取出來(lái)消息內(nèi)容var message = Encoding.Unicode.GetString(buffer, 0, length);//顯示消息Console.WriteLine(message);//接收下一個(gè)消息(因?yàn)檫@是一個(gè)遞歸的調(diào)用,所以這樣就可以一直接收消息了)socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);}catch(Exception ex){Console.WriteLine(ex.Message);}}} }

最后調(diào)試起來(lái)看到的效果如下圖

?

本文源代碼,可以通過這里下載?http://files.cnblogs.com/chenxizhang/SocketWorkshop.rar


from:?http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的你得学会并且学得会的Socket编程基础知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 白嫩日本少妇做爰 | 玖草在线观看 | 国产又粗又猛又爽又黄的网站 | 免费av黄色 | 91在线视频播放 | 麻豆md0049免费 | 寻找身体恐怖电影免费播放 | 福利久久久 | 日韩国产小视频 | 成人va视频| 国产av无码专区亚洲av麻豆 | 日爽夜爽 | 久久婷婷久久 | 亚洲精品久久久久久久久久久久久 | 免费在线一级片 | 麻豆传媒mv | 国产无套内射又大又猛又粗又爽 | 国产麻豆一区二区 | 91精品国产色综合久久不卡98 | 91国在线视频 | 国产美女激情视频 | 99久久国产精 | 亚洲天堂视频在线观看 | 午夜黄色网址 | 污网站在线观看免费 | 亚洲爱| 日韩欧美精品在线播放 | 日本黄色大片免费看 | 在线免费av观看 | 中文字幕网站在线观看 | 国产日韩欧美在线观看视频 | 中文字幕一区二区三区久久久 | 免费久久一级欧美特大黄 | 成年视频在线播放 | 欧美与黑人午夜性猛交久久久 | 极品女神无套呻吟啪啪 | 大香伊人中文字幕精品 | 特及毛片 | 国产伦精品一区二区. | 国产嫩bbwbbw高潮 | 综合网在线视频 | 777色婷婷 | 小泽玛利亚一区二区三区在线观看 | 国产美女精品视频国产 | 中文字幕av播放 | 丰满少妇一区 | 美女脱衣服一干二净 | 国产日韩在线一区 | www.桃色| 刘亦菲久久免费一区二区 | 欧美日韩黄色片 | 天天干夜夜拍 | 久久久久99人妻一区二区三区 | 99re这里只有精品6 | 麻豆黄色网 | 91久久精品一区二区三 | 欧美sm视频 | 欧美视频一级 | 又粗又猛又爽又黄少妇视频网站 | 中文字幕免费高清 | 亚洲国产精选 | 97超碰福利 | 一本色道久久88综合无码 | 国产视频一区在线观看 | 无套内谢少妇高潮免费 | 色av一区 | 麻豆一区二区三区在线观看 | 男人靠女人免费视频网站 | 麻豆视频在线播放 | 日韩欧美大片 | 亚洲区小说区 | 九九热在线视频免费观看 | 97视频免费在线观看 | 亚洲深夜福利 | 国产无毛片 | 免费观看nba乐趣影院 | 强乱中文字幕av一区乱码 | 男人天堂最新网址 | 国产欧美精品一区 | 日韩av在线播放网址 | 国产麻豆一区二区三区 | 成人免费毛片观看 | 在线免费观看黄色小视频 | 天天天色| 国产精品成人无码专区 | 最新中文字幕在线观看视频 | 亚洲无线看 | 午夜美女福利视频 | 欧美网站在线 | 成人毛片视频网站 | 欧美性猛交xxxx乱 | 天天综合永久入口 | zzjj国产精品一区二区 | 97se亚洲综合 | 日韩极品一区 | 99久久久久成人国产免费 | 偷拍欧美亚洲 | 欧美日韩在线影院 | 国内精品一区二区三区 |