Swoole json이 불완전하면 어떻게 해야 하나요?
swoole클라이언트와 서버 간 송수신 데이터의 무결성 문제 해결
1 다음 예에서는 swoole 서비스를 시작한 후 9501 포트를 수신하여 클라이언트에서 보낸 데이터를 수신합니다. 클라이언트를 변경하지 않고 반환합니다.
class Server { private $serv; public function __construct() { $this->serv = new swoole_server("127.0.0.1", 9501); $this->serv->set(array( 'worker_num' => 4, //一般设置为服务器CPU数的1-4倍 'daemonize' => 1, //以守护进程执行 'max_request' => 2000, 'dispatch_mode' => 2,//进程数据包分配模式 1平均分配,2按FD取摸固定分配,3抢占式分配 'task_worker_num' => 8, //task进程的数量 "task_ipc_mode " => 3 , //使用消息队列通信,并设置为争抢模式 "log_file" => "./log/taskqueueu.log" ,//日志 )); $this->serv->on('Receive', array($this,'onReceive'));//接收到数据时回调此函数 $this->serv->start(); } public function onReceive(swoole_server $serv, $fd, $from_id, $data ) { $serv->send($fd, $data); usleep(500); //不加延时的话,经常两条数据被合并成一条返回了。 $serv->close($fd); } public function onClose(swoole_server $serv, $fd) { $serv->send($fd, 'CLOSED'); } }
새 서버로 직접 서버를 시작하세요.
2. swoole 클라이언트를 시작하고, 서버에 데이터를 보내고, 반환을 받습니다.
$client = new swoole_client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } $data=[ 'type'=>1, 'data'=>array( 'PlatformCode'=>'...........很长的数据.', ) ]; $sender=$client->send(json_encode($data)."\r\n\r\n"); while($result = $client->recv()){ if($result=='CLOSED'){ echo "任务结束。byebye~\r\n"; break; }else{ echo $result; } } $client->close();
비교적 큰 데이터 패킷을 보낼 때 수신된 json 패킷이 불완전하다는 것을 알게 됩니다. 이는 EOF 프로토콜 처리 방법을 사용하여 해결할 수 있습니다. 예를 들어 서버에서 설정하면
$serv->set( array('open_eof_split' => TRUE, 'package_eof' => "\r\n\r\n") );
이렇게 됩니다. rnrn'은 EOF 프로토콜 끝 문자가 됩니다.
데이터 패킷을 보낼 때 패킷 끝에 'rnrn'을 추가하세요. 인터페이스 데이터 중에 이 문자가 나타나면 데이터가 수신된 것으로 간주되어 데이터의 무결성이 보장됩니다.
참고: 'rnrn' 문자는 데이터 패킷에 나타날 수 없습니다. 그렇지 않으면 하위 패키지 오류가 발생합니다.
Swoole의 서버와 비동기 클라이언트는 모두 onReceive 콜백 함수에서 데이터 패킷을 처리합니다. 프로토콜 처리가 설정되면 onReceive 이벤트는 완전한 데이터 패킷이 수신될 때만 트리거됩니다.
또는 다음과 같이 보낼 패킷의 길이를 미리 설정할 수도 있습니다.
$server->set(array( 'open_length_check' => true, 'package_max_length' => 81920, 'package_length_type' => 'n', //see php pack() 'package_length_offset' => 0, 'package_body_offset' => 2, ));
패킷의 길이를 수정하여 데이터 무결성을 보장할 수 있습니다.
고정 헤더 프로토콜은 BAT의 서버 프로그램에서 자주 볼 수 있습니다. 이 프로토콜의 특징은 데이터 패킷이 항상 헤더 + 본문의 두 부분으로 구성된다는 것입니다. 패킷 헤더에는 패킷 본문 또는 전체 패킷의 길이를 지정하는 필드가 있으며 일반적으로 길이는 2바이트/4바이트 정수로 표시됩니다. 서버는 패킷 헤더를 수신한 후 완전한 데이터 패킷을 달성하기 위해 길이 값을 기반으로 수신해야 하는 데이터의 양을 정확하게 제어할 수 있습니다. Swoole의 구성은 이 프로토콜을 매우 잘 지원할 수 있으며 모든 상황을 처리하기 위해 네 가지 매개변수를 유연하게 설정할 수 있습니다.
Swoole의 서버와 비동기 클라이언트는 모두 onReceive 콜백 함수에서 데이터 패킷을 처리합니다. 프로토콜 처리가 설정되면 onReceive 이벤트는 완전한 데이터 패킷이 수신될 때만 트리거됩니다. 동기화 클라이언트가 프로토콜 처리를 설정한 후에는 $client->recv()를 호출할 때 더 이상 길이를 전달할 필요가 없습니다. 전체 패킷을 수신한 후 recv 함수가 반환되거나 오류가 발생합니다.
위 내용은 Swoole json이 불완전한 경우 수행할 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!