Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过TCP同时发送两个数据包时,其中一个丢失_Java_Php - Fatal编程技术网

Java 通过TCP同时发送两个数据包时,其中一个丢失

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

我使用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_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)并读取分隔符。

非常感谢!