MyException - 我的异常网
当前位置:我的异常网» 编程 » [转]C#Net Socket网络通讯编程小结

[转]C#Net Socket网络通讯编程小结

www.MyException.Cn  网友分享于:2015-08-26  浏览:14次
[转]C#.Net Socket网络通讯编程总结

[转]C#.Net Socket网络通讯编程总结
2011年11月16日
  1、理解socket
  1)、
Socket接口是TCP/IP网络的应用程序接口(API)。Socket接口定义了许多函数和例程,程序员可以用它们来开发TCP/IP网络应用程序。Socket可以看成是网络通信上的一个端点,也就是说,网络通信包括两台主机或两个进程,通过网络传递它们之间的数据。为了进行网络通信,程序在网络对话的每一端都需要一个Socket。
  2)、TCP/IP传输层使用协议端口将数据传送给一台主机的特定应用程序,从网络的观点看,协议端口是一个应用程序的进程地址。当传输层模块的网络软件模块要与另一个程序通信时,它将使用协议端口。Socket是运行在传输层的API,所以在使用Socket建立连接发送数据时,要指定一个端口给它。
  3)、根据通信性质的不同,可以把Socket分成3类:
  ① Stream socket(流套接字):该类Socket提供双向、有序、无重复的数据流服务,它使用于处理大量网络数据;
  ② Dgram Socket(数据报套接字):该类Socket支持双向的数据流,但不保证数据传输的可靠性、有序性和无重复性,也就是说一个从Dgram Socket接收信息的进程,有可能发现信息重复或和发出时顺序不同的情况;
  ③ Raw Socket(原始套接字):该类 Socket可以访问底层的协议。
  4)、使用Socket接口进行网络通信的过程如图5-1所示,简要步骤如下:
  ① 建立一个socket;
  ② 按要求配置socket,即将socket连接到远程主机或给socket指定一个本地协议端口;
  ③ 按要求通过socket发送和接收数据;
  ④ 关闭此socket。
  
  
  
  2、C#编程要点
  根据上述的步骤,使用C#设计通过Socket 实现点对点通信的程序需要掌握4个编程要点:socket的构造、socket的配置和连接、数据的发送和接收、socket的关闭。
  1)、命名空间的添加
  using System.Net;
  using System.Net.Socket; //用于操纵Socket类
  2)、构造一个新的socket对象
  在C#中,采用socket函数构造一个socket对象,socket函数原型如下:
  public Socket (AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);
  AddressFamily成员指定socket用来解析地址的寻址方案。例如,InterNetwork表示需要一个IP版本4的地址,InterNetworkV6表示IP版本6的地址。
  SocketType参数指定Socket的类型。例如,Raw支持对基础传输协议的访问,Stream支持可靠、双向、基于连接的数据流。
  ProtocolType指定Socket类支持的协议。例如,IP表示网际协议,TCP表示传输控制协议。
  注意:3个参数不是独立的,有些地址族会限制可与其一起使用的协议,并且套接字类型在协议中通常是隐式的。如果地址族、套接字类型和协议类型不匹配将导致无效的Socket。
  例如,构造一个新的Socket 对象,采用IP版本4的地址,支持可靠、双向、基于连接的数据流,采用TCP协议:
  Socket sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)
  3)、Socket的配置和连接
  
为了将Socket和主机关联,必须将主机表示成网络端点的形式。在C#中,采用IPEndPoint类表示网络端点,IPEndPoint函数原型如下:
  ① public IPEndPoint(IPAddress address,int port)
  参数:address表示IP地址,port表示提供服务的端口号。
  在服务器端将构造socket对象与表示服务器的网络端点绑定,然后开始进行监听,在收到连接请求后建立连接。
  主要用语以下3个函数:Bind、Listen和Accept。
  函数原型如下:
  ② public void Bind(EndPoint localEP)
  参数localEP为与socket关联的网络端点。
  ③ public void Listen(int backlog)
  参数backlog为挂连接队列的最大长度
  ④ public Socket Accept()
  返回值为socket,用于处理接收的连接请求。
  :构造一个服务器的网络端点,对socket进行绑定,开始监听,接受连接请求。
  IPAddress ServerIP=IPAdress.Parse("192.18.16.186"); //设定服务器IP地址
  IPEndPoint Server=new IPEndPoint(ServerIP,8866); //生成服务器网络端点
  Socket Sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp) // 构造一个socket
  Sock.Bind(Server); //将socket和服务器绑定
  Sock.Listen(8); //开始监听,允许连接队列的长度为8
  Socket connectsock=sock.Accept(); //返回socket,用于同连接请求的socket通信
  客户端向服务器端发出连接请求,用到Connect函数,Connect函数原型如下:
  ⑤ public Connect(EndPoint remoteEP)
  参数:remoteEP表示要连接的服务器端点。例如向服务器端发出连接请求,服务器IP为ServerIP,端口为Port。
  IPEndPoint Server=new IPEndPoint(ServerIP,Port); //定义要连接的服务器端点
  Sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp) // 构造一个socket
  Sock.Connect(Server); // 与服务器连接
  4)、数据的传送和接收
  
使用两个用于传送和接收数据的函数:Send、Receive。函数原型如下:
  ◆ public int Send(byte[] buffer,int size,SocketFlag socketFlags)
  参数:buffer表示要发送的数据;size表示要发送数据的大小;socketFlags提供Socket消息的常数值,具有允许按位组合其成员值的属性。
  返回值为发送到socket的字节数。
  ◆public int Receive(byte[] buffer,int size,SocketFlage socketFlags)
  参数:buffer表示接收到的数据的存储位置;size表示要接收数据的大小;socketFlags提供Socket消息的常数值,具有允许按位组合其成员值的属性。
  返回值为接收到socket的字节数。
  :接收来自客户端的数据,同时将该数据返回到客户端。Socket是前面例子中定义和设置好的。
  public static string data=null; //定义字符串变量存放接收到的信息
  bytes=new byte[1024];
  int bytesRec=connectsock.Receive(bytes,bytes.Lentgh,0); //接受来自客户端的数据
  Console.WriteLine("Text received:{0}",bytes); //显示接收到的数据
  connectsock.Send(bytes,bytes.Length,0); //发送数据到客户端
  5)、socket的关闭
  在socket关闭之前,要确保已经发送和接收完所有挂起的数据,因此在关闭socket之前,要先调用Shutdown,函数原型如下:
  ◆public void Shutdown(SocketShutdown how)
  参数:SocketShutdown指定不再允许的操作。成员名称:Both禁止socket发送和接收;Receive禁止socket接收数据;Send禁止socket发送数据。
  采用close函数强制关闭Socket连接。函数原型如下:
  ◆public void clsoe()
  当该套接字被关闭时,Connected属性将被设置为false。
  原文链接:
  http://apps.hi.baidu.com/share/detail/21036427
  其他有用链接:
  http://www.68design.net/Development/Aspnet/Examples-AspNet/7675-1.html
  http://www.cnblogs.com/buzzlight/archive/2010/06/30/1768493.html
  http://www.cnblogs.com/wzd24/archive/2009/03/09/1407248.html
  http://msdn.microsoft.com/en-us/library/fx6588te.aspx

文章评论

我的丈夫是个程序员
我的丈夫是个程序员
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
旅行,写作,编程
旅行,写作,编程
 程序员的样子
程序员的样子
那些争议最大的编程观点
那些争议最大的编程观点
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
代码女神横空出世
代码女神横空出世
编程语言是女人
编程语言是女人
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
鲜为人知的编程真相
鲜为人知的编程真相
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Java程序员必看电影
Java程序员必看电影
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
中美印日四国程序员比较
中美印日四国程序员比较
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
为什么程序员都是夜猫子
为什么程序员都是夜猫子
每天工作4小时的程序员
每天工作4小时的程序员
10个调试和排错的小建议
10个调试和排错的小建议
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员都该阅读的书
程序员都该阅读的书
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
漫画:程序员的工作
漫画:程序员的工作
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员的鄙视链
程序员的鄙视链
如何成为一名黑客
如何成为一名黑客
一个程序员的时间管理
一个程序员的时间管理
程序员必看的十大电影
程序员必看的十大电影
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
老程序员的下场
老程序员的下场
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员和编码员之间的区别
程序员和编码员之间的区别
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有