Php 非阻塞套接字:消息是否排队?

Php 非阻塞套接字:消息是否排队?,php,sockets,php-5.3,asyncsocket,Php,Sockets,Php 5.3,Asyncsocket,据我所知,可以在PHP5.x中创建网络 但是,如果脚本使用相同的非阻塞套接字发送多条长消息,会发生什么情况,如下所示: socket_write($socket, $string1, $length); socket_write($socket, $string2, $length); socket_write($socket, $string3, $length); socket_write($socket, $string4, $length); 这些消息是否排队(在发送方/接收方?),或

据我所知,可以在PHP5.x中创建网络

但是,如果脚本使用相同的非阻塞套接字发送多条长消息,会发生什么情况,如下所示:

socket_write($socket, $string1, $length);
socket_write($socket, $string2, $length);
socket_write($socket, $string3, $length);
socket_write($socket, $string4, $length);
这些消息是否排队(在发送方/接收方?),或者接收方是否可能因为发送“并行”而获得不同消息的一部分


例如:接收器可能会获得10个字节的$string1,然后是30个字节的$string2,然后是另外25个字节的$string1。。。以此类推……

这取决于套接字使用的协议。有关插座的可能类型,请参阅。主要类型为UDP和TCP:

udp用户数据报协议是一种无连接、不可靠、记录长度固定的协议。由于这些方面的原因,UDP需要最少的协议开销

tcp传输控制协议是一种可靠的、基于连接的、面向流的全双工协议。TCP保证所有数据包都将按发送顺序接收。如果任何数据包在通信过程中以某种方式丢失,TCP将自动重新传输该数据包,直到目标主机确认该数据包。出于可靠性和性能原因,TCP实现本身决定底层数据报通信层的适当八位字节边界。因此,TCP应用程序必须考虑部分记录传输的可能性


为了直接回答您的问题,TCP套接字将保证按订单交付,而UDP套接字则不会。

这意味着对于我上面的示例:TCP套接字将保证在完全接收到$string1之前,接收方永远不会看到来自$string2、3或4的数据?是的,但请记住,所有数据都将写入同一套接字,因此,接收器将数据视为单一信息流。除非您向数据中添加字符串长度、分隔符或其他信息,否则接收者将不知道
$string1
的结束和
$string2
的开始。@Justin Ethier这就是我要找的信息!:-)谢谢。我还用一个例子更新了我的问题来澄清。@Mike:请记住,这有点特定于PHP。如果启动多线程(PHP不支持,但其他一些,如C或Java支持),则必须在套接字上实现互斥锁(锁),以防止接收方出现这种奇怪、意外的行为。@netcoder这是一个重要信息,因为我还将创建一个C#socket应用程序。这意味着,我必须锁定一个发送套接字,直到发送完完整的数据?如果是这样的话:为什么不使用阻塞套接字呢?