講故事學Socket編程


基礎比較差,知識不夠全面,Socket編程方面還是個空白頁,網上關於這方面的文章不少,學習了之后,做一下筆記。

關於Socket的概念等基礎知識我就不想累贅了。本文只想通過跟實際的事情的類比來記憶一個很簡單的Socket編碼過程。好,直奔主題。

 

話說有個呆子A君,想干這個客服,他就先搞到一個能正常通話的手機,能正常通話肯定會有電話號碼。

那么客服人員A君,向外公布了他的客服電話,管他是通過什么途徑,總之有人知道就行了。總之這個A君就等啊等啊 等着他的電話響。

花開兩朵各表一枝。有個茂利B君也不知通過什么途徑得到了A君的電話,於是B君掏出他的山寨手機。

B君迅速撥號,嘟嘟嘟。。。。

與此同時,A君的電話響了,他迅速接通電話“喂!”

接着他倆說了啥咱不理,反正說了一些話。

反正到最后B君說了“拜拜”,掛了電話。

A君也相應把電話掛了。

說起這Socket通訊的過程,跟上面的故事有一定的相似程度。

打電話

接聽方

主叫方

電話號碼

手機

人類語言

Socket

服務端

客戶端

EndPoint

Socket

byte[]

 

當然這個類比不怎么完美,可至少幫助我記憶整個流程吧。

 

 

把上面兩個人所做的分離出來

A君

1先搞一個能打通的電話

2在等待有人打電話來

3接通打來的電話

4跟那個人聊天

5到對方說掛了之后掛斷電話。

 

B君

1找個電話

2撥打A的號碼,等待接通

3跟A聊天

4提出掛電話終止通話。

 

那現在就分別把這兩個人所作的事轉換成代碼

首先是服務端的

 1             //開一張SIM卡,也就是先外放一個可供訪問的ip以及端口
 2             IPEndPoint serverPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081); 
 3             //這個就是手機,建一個服務端的套接字對象
 4             Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 5             //把SIM卡放到手機上,IP地址綁定的Socket上
 6             serverSocket.Bind(serverPoint);
 7             //等待着別人打電話來,監聽
 8             serverSocket.Listen(10);
 9             //電話來的,接聽
10             Socket clientSocket = serverSocket.Accept();
11             //這個相當於來電顯示知道對方的電話號碼
12             IPEndPoint clientPoint = clientSocket.RemoteEndPoint as IPEndPoint ;
13             if (clientPoint != null) Console.WriteLine("對方是{0}:{1}",clientPoint.Address,clientPoint.Port);
14             //這部分就是交談了
15             clientSocket.Send(Encoding.ASCII.GetBytes(""));
16             while (true)
17             {
18                 byte[] datas=new byte[1024];
19                 int rec= clientSocket.Receive(datas);
20                 string msg = Encoding.ASCII.GetString(datas);
21                 Console.WriteLine(msg); 
22                 if (msg == "拜拜") break;
23                 msg = "已經收到" + msg;;
24                 datas = Encoding.ASCII.GetBytes(msg);
25                 clientSocket.Send(datas);
26                 //其實這里也可以用這種方式,看網上其他網友的轉碼都帶長度和偏移量,我就不太清楚為啥要這樣
27                 //現在只是初級階段,能實現效果則行。
28                 //clientSocket.Send(datas,datas.Length,SocketFlags.None);
29             }
30             //交談完畢要掛機
31             clientSocket.Close();
32             serverSocket.Close();
33 
34             clientSocket.Dispose();
35             clientSocket.Dispose();

 

接着是客戶端

 1             byte[] datas = new byte[1024];
 2             //獲取到對方的電話,就是IP和端口
 3             IPEndPoint serverPoint=new IPEndPoint(IPAddress.Parse("127.0.0.1"),8081);
 4             //找個能打的電話,建立Socket
 5             Socket clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
 6             try
 7             {
 8                 //撥號了等待對方接聽,連接服務端
 9                 clientSocket.Connect(serverPoint);
10             }
11             catch (Exception e)
12             {
13                 Console.WriteLine(e.Message);
14                 return;
15             }
16             //開始交談了
17             clientSocket.Receive(datas);
18             Console.WriteLine(Encoding.ASCII.GetString(datas));
19             while (true)
20             {
21                 string msg = Console.ReadLine();
22                 if(msg!="拜拜")break;
23                 datas = Encoding.ASCII.GetBytes(msg);
24                 clientSocket.Send(datas);
25                 datas = new byte[1024];
26                 clientSocket.Receive(datas);
27                 Console.WriteLine(Encoding.ASCII.GetString(datas));
28             }
29             //交談結束,掛機
30             clientSocket.Shutdown(SocketShutdown.Both);
31             clientSocket.Close();
32 
33             clientSocket.Dispose();

 

最后說一下,上面的代碼用到中文,覺得比較不專業,不過只是個demo,沒太大關系吧,呵呵!整個通信過程都是發送/接收的形式,用一個死循環來保持這個發送/接收過程,肯定要有點標志性的東西來結束這個循環,我這里就定義了“拜拜”,為了跟上面的故事吻合。最后還得說一下,Socket這玩意用完了最好釋放一下資源,調用一下Dispose()方法。

以上僅個人看法,由於認識尚淺,故有什么說錯說漏的,請各位盡管的批,在下虛心接納,謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM