- socket和socket通信的数据没有经过编码,所以在socket服务端无需对接收的数据解码,和对返回的数据编码
- socket和socket建立连接时就使用的socket协议进行通信,而websocket建立连接时使用的HTTP协议,必须提升通信协议为websocket
- socket和socket通信没有握手过程,socket和websocket时,socket必须给websocket返回握手响应
附socket与socket通信参考代码
server
<?php
$host = '0.0.0.0';
$port = 12345;
$master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create()函数调用失败。");
socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed");// 设置重用
socket_bind($master, $host, $port) or die("socket_bind() 函数调用失败。");
socket_listen($master, 20);
$sockets = [];
$sockets[] = $master;
while(true) {
$activeSockets = $sockets;
$write = $except = null;
$status = socket_select($activeSockets, $write, $except, null);
if ($status === 0) {
continue;
}
if ($status === false) {
echo socket_last_error() . "\r\n";
continue;
}
if (in_array($master, $activeSockets)) {
$newSocket = socket_accept($master);
if (!$newSocket) {
continue;
}
$sockets[] = $newSocket;
$activeSockets[] = $newSocket;
$index = array_search($master, $activeSockets);
unset($activeSockets[$index]);
}
foreach($activeSockets as $activeSocket) {
$socketId = (int) $activeSocket;
$requestDataLength = socket_recv($activeSocket, $requestData, 2048, 0);
if ($requestDataLength == 0) {
socket_close($activeSocket);
$index = array_search($activeSocket, $sockets);
unset($sockets[$index]);
continue;
}
$response = "";
$data = json_decode($requestData, true);
if ($data) {
switch($data['operator']) {
case 'add':
$response = $data['firstNum'] + $data['secondNum'];
break;
case 'sub':
$response = $data['firstNum'] - $data['secondNum'];
break;
case 'multi':
$response = $data['firstNum'] * $data['secondNum'];
break;
case 'div':
$response = $data['firstNum'] / $data['secondNum'];
break;
}
} else {
$response = $requestData;
}
socket_write($activeSocket, $response, strlen($response));
}
};
client
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, '127.0.0.1', '12345');
$raw = json_encode([
'firstNum' => 10,
'secondNum' => 20,
'operator' => 'add',
]);
socket_write($socket, $raw, strlen($raw));
$result = socket_read($socket, 2048);
echo $result;
socket_close($socket);