博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
讲故事学Socket编程
阅读量:6880 次
发布时间:2019-06-27

本文共 3779 字,大约阅读时间需要 12 分钟。

基础比较差,知识不够全面,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()方法。

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

 

转载地址:http://wgubl.baihongyu.com/

你可能感兴趣的文章
SAN实现
查看>>
自定义过滤器及标签
查看>>
I.MX6 change boot partition 1 to User area
查看>>
struts2使用验证文件实现校验
查看>>
试题 H: 人物相关性分析 第十届蓝桥杯
查看>>
[Inside 快訊] Ruby 成為國際標準了
查看>>
centos7下安装tomcat
查看>>
一周总结
查看>>
HDU 5312:Sequence
查看>>
POJ 3393:Lucky and Good Months by Gregorian Calendar 年+星期 模拟
查看>>
WPF之Binding基础十 使用RelativeSource作为Binding的源
查看>>
接口测试-学习记录
查看>>
bzoj 1015 并查集
查看>>
REdis主从复制之repl_backlog
查看>>
openssl编程轻松入门(含完整示例)
查看>>
数独挑战之九宫格入门第一题解题思路
查看>>
开启Redis
查看>>
【原创】python模拟腾讯网页登录
查看>>
Swiper实现全屏视觉差轮播
查看>>
poj1195(二维树状数组)
查看>>