Java 通过TCP同时发送两个数据包时,其中一个丢失
我使用Java作为服务器,PHP作为客户机,因此在连接到服务器后,我会执行socket\u set\u nonblock(这样当socket\u读取时,流不会停止),然后通过while()接受包(socket\u read),但问题是,如果一次发送两个包,第二个包就会消失Java 通过TCP同时发送两个数据包时,其中一个丢失,java,php,Java,Php,我使用Java作为服务器,PHP作为客户机,因此在连接到服务器后,我会执行socket\u set\u nonblock(这样当socket\u读取时,流不会停止),然后通过while()接受包(socket\u read),但问题是,如果一次发送两个包,第二个包就会消失 // socket class public function __construct(int $port) { if(!($this->socket = @socket_create(AF_INET, SOCK
// socket class
public function __construct(int $port) {
if(!($this->socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP)))
var_dump('Ошибка при создании сокета: ' . socket_strerror(socket_last_error()) . PHP_EOL);
if (!@socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, 1))
var_dump('Не могу установить опцию на сокете: ' . socket_strerror(socket_last_error()) . PHP_EOL);
if(!@socket_bind($this->socket, '127.0.0.1', $port))
var_dump('Не удалось привязать адрес: ' . socket_strerror(socket_last_error()) . PHP_EOL);
}
public function connect(string $address, int $port): bool {
if(($result = @socket_connect($this->socket, $address, $port)))
if(!socket_set_nonblock($this->socket))
var_dump('Не могу установить опцию: [nonblock] на сокете: ' . socket_strerror(socket_last_error()) . PHP_EOL);
return $result;
}
public function readData(): string {
return socket_read($this->socket, ClientConst::MTU_SIZE);
}
// main class
public function main() {
while(true) {
if(($rawPacket = $this->primarySocket->readData()) !== '') {
//todo:
}
}
}
TCP没有消息。TCP发送字节流。不能保证一次“发送”会在另一端产生一次“接收”。可能是接收呼叫从两个发送读取数据;可能是两个接收呼叫,每个呼叫都是来自一个发送的数据的只读部分
如果需要消息边界,则需要提供它们。有两种常见的技术:在每条消息前面加上一个长度,然后读取那么多字节;或者使用分隔符(如\n)并读取分隔符。非常感谢!