我的意思是,我已经阅读了有关Dart RawSockets的问题,还阅读了API,但是我不清楚如何使用它们。 Dart RawSockets与C rawsockets是否相同?
此外,Dart RawSockets和普通套接字之间有什么区别?
最佳答案
Socket
是更高级别的概念。它实现字节的Stream
(实际上是字节数组)和IOSink
。流的listen
和到达套接字的数据出现在流中。当您想通过套接字发送数据时,使用add
将数据发送到接收器,然后将其移走。RawSocket
是较低级别的概念。现在,不再需要获取字节流,而只是告诉您何时可以读取字节。 (您将获得一系列事件,告诉您何时有数据可用。您有责任随后调用read
进行收集。)这使您可以在Unix套接字模式下使用select
来了解是否有可用数据,从而进行更多工作。这样您在阅读它时就不会阻塞。
Dart的流使您不必承担选择/阻止不同语言的读取/分离读取器线程的大部分责任。从Socket
读取数据时,您不必担心,只要有数据,数据就会到达流中。
注意如何只有一个RawDatagramSocket
。这是有道理的,因为UDP数据包是离散的,而不是字节流。 UDP套接字仅告诉您可以读取数据包,然后再读取它。