基礎比較差,知識不夠全面,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()方法。
以上僅個人看法,由於認識尚淺,故有什么說錯說漏的,請各位盡管的批,在下虛心接納,謝謝!