讲故事学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()方法。

以上仅个人看法,由于认识尚浅,故有什么说错说漏的,请各位尽管的批,在下虚心接纳,谢谢!

 

posted @ 2013-04-05 13:21  猴健居士  阅读(3902)  评论(13编辑  收藏  举报