abstract:foreach ($sockets as $socket) { // 如果可讀的是服務(wù)器 socket, 則處理連接邏輯;
foreach ($sockets as $socket) {
// 如果可讀的是服務(wù)器 socket, 則處理連接邏輯;
if ($socket == $this->master) {
socket_accept($this->master);
// socket_accept() 接受 請(qǐng)求 “正在 listen 的 socket(像我們的服務(wù)器 socket )” 的連接, 并一個(gè)客戶端 socket, 錯(cuò)誤時(shí)返回 false;
self::connect($client);
continue;
}
// 如果可讀的是其他已連接 socket ,則讀取其數(shù)據(jù),并處理應(yīng)答邏輯
} else {
// 函數(shù) socket_recv() 從 socket 中接受長(zhǎng)度為 len 字節(jié)的數(shù)據(jù),并保存在 $buffer 中。
$bytes = @socket_recv($socket, $buffer, 2048, 0);
if ($bytes < 9) {
// 當(dāng)客戶端忽然中斷時(shí),服務(wù)器會(huì)接收到一個(gè) 8 字節(jié)長(zhǎng)度的消息(由于其數(shù)據(jù)幀機(jī)制,8字節(jié)的消息我們認(rèn)為它是客戶端異常中斷消息),服務(wù)器處理下線邏輯,并將其封裝為消息廣播出去
$recv_msg = $this->disconnect($socket);
} else {
// 如果此客戶端還未握手,執(zhí)行握手邏輯
if (!$this->sockets[(int)$socket]['handshake']) {
self::handShake($socket, $buffer);
continue;
} else {
$recv_msg = self::parse($buffer);
}
}
// 廣播消息
$this->broadcast($msg);
}
}
}
Correcting teacher:查無(wú)此人Correction time:2019-07-04 13:18:00
Teacher's summary:完成的不錯(cuò)。代碼很清晰,注銷很明確。繼續(xù)加油