zoukankan      html  css  js  c++  java
  • 抬杠(异步套接字和二进制XML乱弹)

    抬杠(异步套接字和二进制XML乱弹)
      都说我爱抬杠。“说你啥都不听,说你你还犟,说什么你都不服,你要老这样,肯定要吃亏的。”类似的话不止一个人一次说过我。这不,上次又和同事争论起来了,很久没有和人争论什么了,其实我感觉讨论个技术问题,不至于搞的这么面红耳赤吧,现在不像以前了,一般我我都不爱争论下去了。不过这样的事老发生在我身上,确实有我的问题,也许就是我思路不清晰,表达不清楚吧,讨论的问题容易让人不知道问什么。是该多锻炼锻炼这方面的能力了。
      其实,头一天讨论的是异步套接字的问题。我刚开始没有详细看过底层关于windows socket的资料,只了解dotnet下的System.Net.Socket命名空间下的几个类。MSDN里说的异步套接字(服务端套接字和客户端套接字)都是通过不同的线程来实现的。具体文字描述如下:

    若要在执行过程中使用单独的线程处理通信,请使用下面的方法,这些方法适用于异步操作模式。

    如果当前使用的是面向连接的协议(如 TCP),则可使用 Socket、BeginConnect 和 EndConnect 方法来连接侦听主机。通过使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以进行异步数据通信。可以使用 BeginAccept 和 EndAccept 处理传入的连接请求。

    如果您使用的是 UDP 等无连接协议,则可以使用 BeginSendTo 和 EndSendTo 来发送数据报,而使用 BeginReceiveFrom 和 EndReceiveFrom 来接收数据报。
    地址:
    ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref10/html/T_System_Net_Sockets_Socket.htm

      我来说说我的理解哦:拿连接主机的操作来说吧,我认为的就是就是主线程调用BeginConnect()方法,然后主线程不阻塞直接执行下面的语句,而系统会自动启动一个线程去执行回调方法,而这个回调方法会调用EndSend()方法一直阻塞到连接上对方的主机。等连接上主机的时候可以调用ManualResetEvent.Set方法通知主线程已经连接上主机可以发送数据了,或者在回调里EndSend()方法后执行发送数据等操作。一直以为这种方式就算是异步Socket了。
      后来,同事给我们培训Socket的时候说SendTo和ReceiveFrom这类的方法才是非阻塞模式,也就是异步模式(我理解的意思哦,别人怎么理解我也不知道了)。说这两个方法执行的时候(SendTo)就算数据没有发送完毕或者(ReceiveFrom)如果没有数据要接受直接就往下运行,而不是像同步Socket那样阻塞在那里(Send)等待数据发送完毕或者(Receive)等待有可接受的数据。说异步模式利用了windows的消息机制,当数据发送完毕或者有数据发送来要接受的时候会引发一个消息,只要消息来了,根据消息类型进行不同的操作就可以了。
      同事说的这些,我没有异议,我感觉他说的处理消息和.net里处理回调函数是一样的。我感觉.net那样也是异步套接字。可能.net里的阻塞说的是线程的阻塞,他说的是端口的阻塞。用Receive的时候端口阻塞住了,而用ReceiveFrom的时候如果没有可接受的数据直接就执行下面的语句了。其实我完全没有反对同事的说法,可我就感觉(只是感觉).net下面用线程实现的不影响主线程执行其它操作的方法也算是异步,可能我们争论的同步异步不是一回事吧,此异步非彼异步?
      
      第二个争论的问题是,文本转换成二进制会不会变大。是这样的,一般介绍web服务的地方都会提到web服务的一个缺点,就是性能问题,因为web服务传递的是xml,而xml是文本表示的,不如传递二进制快。后来W3C不是又起草了个二进制XML吗?我就想问个问题,这文本转换成二进制是不是就变小了,传输起来性能就好了呢。同事说,其实文本在底层保存和传输的时候都是二进制的,都是0和1,都是电流,我晕,跟我说这个。又跟我说,web服务是http的http本身就是建立底层socket上的,它本身有一些头信息,以及soap本身封装的时候也有一些包装数据,所以web服务慢。当然,是我没有说明确我问的问题的限制条件,我应该加上,不考虑http头,不考虑soap的包装信息,单纯说用web服务传递一段XML和socket传递一段xml有什么区别?就是截包的话,同样的文本,如果用http传递,和用socket传递,他们的二进制信息应该是相同的呀,ansi码是一样的呀(假如是ansi编码哦),我就怪了,为什么大家都说文本传输慢,二进制传输快呢。其实我就是纳这个闷,完了,我又被数落上了,说我白听了它的培训,搞不清楚文本在内存里,在网络流里就是二进制,就是0和1,所以才会提这个问题。其实他反驳的我说的话,我都没有反对意见,都对,我知道对文本进行GetBytes(str)方法返回的也是字节流,大小肯定是一样的。其实这不叫把文本转换成二进制,这文本就是二进制。那人们说的传输文本比较慢,传输二进制比较快,我感觉是格式的问题,因为把一段数据序列化成XML保存下来或者传输,和序列化成二进制保存下来或传输肯定大,所以说文本慢,二进制快,可文本它也是二进制呀,我晕,我不知道怎么说才能表达。那我猜测W3C的二进制XML,也许是把XML压缩了一下,压缩成二进制了,人眼不能直接看了,这才是真正的把文本转换成二进制,这才是提高性能,只是猜测一下哦,因为我感觉文本本来就可以大幅度压缩的,这样减少网络压力,而传递和接受方都用共同的压缩解压缩算法的话,两边也可以实现透明传输。
      算了,不罗嗦了,我也忘了最初让我疑惑的是什么问题了,看电视看的突然又想起来这件事,随手就写了两句。以后这种无聊的讨论,我尽量不张口了,要真正深入了解了再和大家讨论,我就缺乏一种谦虚低调的态度吧。

  • 相关阅读:
    Python实现将IP地址转换为数字
    转 python两个 list 获取交集,并集,差集的方法
    并发编程之协程
    网络编程之协议
    网络编程
    python之路-模块和包
    python IO模型
    python 线程(队列,线程池),协程(理论greenlet,gevent模块,)
    python 线程(部分)Thread的使用,守护线程,互斥锁,递归锁,信号量,事件,条件,定时器
    常见的面试题
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/536897.html
Copyright © 2011-2022 走看看