讲故事学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()方法。
以上仅个人看法,由于认识尚浅,故有什么说错说漏的,请各位尽管的批,在下虚心接纳,谢谢!