流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)

 


 


      背景:


      有两台计算机,一台为数据源服务器(提供数据服务),另一台为数据接收服务器(数据消费者),两者之间已经建立了TCP
Socket的连接。现在主要讨论接收方接收数据的情况。


     
.net平台下接收方接收数据时有三种方式。在此之前要明白流的概念,流是字节序列的抽象,呵呵,确实有点难理解,不过大家记住一点,流是字节序列相关的,说白了在计算机中的表现是与字节数组相关(比如,NetworkStream与Socket的接收数据缓存相关联,默认大小是一个8192字节大小的接收缓冲区),也许我这种说法不全对,你可以试着这样理解。


    第一种,直接用建立的Socket连接实例调用Receive()或BeginReceive()接收数据。


   
第二种用网络流的方式接收,即用NetworkStream流实例的Read()与BeginRead()数据,在创建NetworkStream实例时以建立的Socket做为参数(new 
NetworkStream(已建立的Socket,...);,主要是为了与Socket的接收缓存相关联。


  
第三种方式,用BufferedStream再串接一下NetworkStream流。大家首先要明白BufferedStream的作用,它是为另一种流再提供一个缓冲区,默认大小为4096字节大小,从其构造函数可以看出。这样其它流就有两个缓冲区,一个是流本身有的,另一个是BufferedStream提供的。所以用BufferedStream串接NetworkStream流后,再用BufferedStream实例的Read()或BeginRead()读取数据会提高性能。


  
三种方式的性能比较:第一种和第二种速度相当,都是用的同一个缓冲区,第二种做法只是为了对流操作提供一个统一的接口,并没有性能上的提高,仅个人看法,希望高手指点。第三种方式,的接收性能要优于前两种。

 

 

 

--------------------------------------------------------------------------

Socket是一种特殊的I/O。常用的Socket类型有两种:

   
流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。


   Visual C#中操作Socket: 虽然Visual
C#可以使用NetworkStream来传送、接收数据,但NetworkStream在使用中有很大的局限性,利用NetworkStream只能传送和接收字符类型的数据如果要传送的是一些复杂的数据如:二进制数据等,它就显得能力有限了。但使用NetworkStream在处理自身可操作数据时,的确要比Socket方便许多。Socket(套接字)几乎可以处理任何在网络中需要传输的数据类型。


表01和表02是Socket类中的常用属性和方法及其简要说明


(比MSDN上翻译的容易明白多了,嘿嘿)


属性 说明
AddressFamily 获取Socket的地址族。
Available 获取已经从网络接收且可供读取的数据量。

Blocking 获取或设置一个值,该值指示Socket是否处于阻塞模式。
Connected
获取一个值,该值指示Socket是否已连接到远程资源。
Handle 获取Socket的操作系统句柄。
LocalEndPoint
获取本地终结点。
ProtocolType 获取Socket的协议类型。
RemoteEndPoint 获取远程终结点。

SocketType 获取Socket的类型。



表01:Socket类的常用属性及其说明


方法           说明
Accept 创建新的Socket以处理传入的连接请求。
BeginAccept
开始一个异步请求,以创建新的Socket来接受传入的连接请求。
BeginConnect 开始对网络设备连接的异步请求。

BeginReceive 开始从连接的Socket中异步接收数据。
BeginReceiveFrom 开始从指定网络设备中异步接收数据。

BeginSend 将数据异步发送到连接的
BeginSendTo 向特定远程主机异步发送数据。
Bind
使Socket与一个本地终结点相关联。
Close 强制Socket连接关闭。
Connect 建立到远程设备的连接。

EndAccept 结束异步请求以创建新的Socket来接受传入的连接请求
EndConnect 结束挂起的异步连接请求。

EndReceive 结束挂起的异步读取。
EndReceiveFrom 结束挂起的、从特定终结点进行异步读取。
EndSend
结束挂起的异步发送
EndSendTo 结束挂起的、向指定位置进行的异步发送。
GetSocketOption 返回Socket选项的值。

IOControl 为Socket设置低级别操作模式
Listen 将Socket置于侦听状态。
Poll
Receive
接收来自连接Socket的数据。
ReceiveFrom 接收数据文报并存储源终结点。
Select 确定一个或多个套接字的状态。

Send 将数据发送到连接的
SendTo 将数据发送到特定终结点。
SetSocketOption 设置Socket选项。

Shutdown 禁用某Socket上的发送和接收。



表02:Socket类的常用方法及其说明


其中“BeginAccept”和“EndAccept”、“BeginConnect”和“EndConnect”、


“BeginReceive”和“EndReceive”、“BeginReceiveFrom”和“EndReceiveFrom”、


“BeginSend”和“EndSend”、“BeginSendTo”和“EndSendTo”是六组异步方法,


其功能分别相当于“Accept”、“Connect”、“Receive”、“ReceiveFrom”、


“Send”和“SendTo”方法。


    下面就通过一个具体的示例,来介绍Visual C#中如何通过托管Socket实现数据传送和接收的具体方法。


    本文示例其实是由二部分组成,也可以看成是客户机程序和服务器程序。客户机程序功能是通过
Socket向服务器程序创建连接,并在连接完成后,向服务器发送数据;服务器程序通过侦听端口,接受网络的Socket的连接请求,并在连接完成后,接收从客户机发送来的数据,并显示出来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值