socket和socket通信与socket和websocket通信的区别

2017/6/19 posted in  PHP
  1. socket和socket通信的数据没有经过编码,所以在socket服务端无需对接收的数据解码,和对返回的数据编码
  2. socket和socket建立连接时就使用的socket协议进行通信,而websocket建立连接时使用的HTTP协议,必须提升通信协议为websocket
  3. 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);