Как клиент Javascript может подключиться к серверу PHp socket? - PullRequest
7 голосов
/ 26 июля 2011

Привет, у меня есть работающий сервер сокетов, написанный на PHP.

Сервер прислушивается к соединениям .. Есть ли идеи, как мой клиент (написанный на javascript) собирается подключиться к серверу и отправить на него данные?

PS: я знаю только, как подключить php-клиент к серверу сокетов, но не знаю, как подключить клиент javascript.

Спасибо всем за потраченное время.

Ответы [ 5 ]

6 голосов
/ 13 сентября 2013

Отвечая на старый вопрос, если люди находят его, как я, через Google.

В настоящее время почти все современные браузеры поддерживают API WebSocket Javascript.С помощью WS клиент JS в браузере может открывать полнодуплексные сокеты для серверов, написанных на PHP или других языках.Сервер должен реализовывать протокол WS, но теперь есть библиотеки WS для PHP, Java и других языков.

На данный момент реализации WS все еще кажутся чем-то вроде движущейся цели, но яВ настоящее время я работаю с браузерными клиентами WS / JS, связывающимися с сервером WS / Java, и, похоже, он работает.

Предложите поиск в Google для реализаций WS на выбранном вами языке сервера.это помогает!

3 голосов
/ 06 июня 2018

Я использую стандартный WebSocket API для клиента.А ядро ​​ PHP-сокет для серверной части.

знает, отправляет и получает данные, используя заголовок в браузере с websocket.Но код сокета PHP, отправлять и получать без заголовка и просто отправлять простые данные.

Поэтому нам нужно смоделировать заголовок на стороне сервера сокетов.

Для изучения и знать, как это сделать, янаписать этот простой пример кода, с помощью этого кода вы можете отправить фразу на сервер и получить обратную фразу, которая в клиенте.

server.php

<?php
//Code by: Nabi KAZ <www.nabi.ir>

// set some variables
$host = "127.0.0.1";
$port = 5353;

// don't timeout!
set_time_limit(0);

// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0)or die("Could not create socket\n");

// bind socket to port
$result = socket_bind($socket, $host, $port)or die("Could not bind to socket\n");

// start listening for connections
$result = socket_listen($socket, 20)or die("Could not set up socket listener\n");

$flag_handshake = false;
$client = null;
do {
    if (!$client) {
        // accept incoming connections
        // client another socket to handle communication
        $client = socket_accept($socket)or die("Could not accept incoming connection\n");
    }

    $bytes =  @socket_recv($client, $data, 2048, 0);
    if ($flag_handshake == false) {
        if ((int)$bytes == 0)
            continue;
        //print("Handshaking headers from client: ".$data."\n");
        if (handshake($client, $data, $socket)) {
            $flag_handshake = true;
        }
    }
    elseif($flag_handshake == true) {
        if ($data != "") {
            $decoded_data = unmask($data);
            print("< ".$decoded_data."\n");
            $response = strrev($decoded_data);
            socket_write($client, encode($response));
            print("> ".$response."\n");
            socket_close($client);
            $client = null;
            $flag_handshake = false;
        }
    }
} while (true);

// close sockets
socket_close($client);
socket_close($socket);

function handshake($client, $headers, $socket) {

    if (preg_match("/Sec-WebSocket-Version: (.*)\r\n/", $headers, $match))
        $version = $match[1];
    else {
        print("The client doesn't support WebSocket");
        return false;
    }

    if ($version == 13) {
        // Extract header variables
        if (preg_match("/GET (.*) HTTP/", $headers, $match))
            $root = $match[1];
        if (preg_match("/Host: (.*)\r\n/", $headers, $match))
            $host = $match[1];
        if (preg_match("/Origin: (.*)\r\n/", $headers, $match))
            $origin = $match[1];
        if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $headers, $match))
            $key = $match[1];

        $acceptKey = $key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
        $acceptKey = base64_encode(sha1($acceptKey, true));

        $upgrade = "HTTP/1.1 101 Switching Protocols\r\n".
            "Upgrade: websocket\r\n".
            "Connection: Upgrade\r\n".
            "Sec-WebSocket-Accept: $acceptKey".
            "\r\n\r\n";

        socket_write($client, $upgrade);
        return true;
    } else {
        print("WebSocket version 13 required (the client supports version {$version})");
        return false;
    }
}

function unmask($payload) {
    $length = ord($payload[1]) & 127;

    if ($length == 126) {
        $masks = substr($payload, 4, 4);
        $data = substr($payload, 8);
    }
    elseif($length == 127) {
        $masks = substr($payload, 10, 4);
        $data = substr($payload, 14);
    }
    else {
        $masks = substr($payload, 2, 4);
        $data = substr($payload, 6);
    }

    $text = '';
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i % 4];
    }
    return $text;
}

function encode($text) {
    // 0x1 text frame (FIN + opcode)
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);

    if ($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif($length > 125 && $length < 65536)$header = pack('CCS', $b1, 126, $length);
    elseif($length >= 65536)
    $header = pack('CCN', $b1, 127, $length);

    return $header.$text;
}

client.htm

<html>
<script>
//Code by: Nabi KAZ <www.nabi.ir>

var socket = new WebSocket('ws://localhost:5353');

// Open the socket
socket.onopen = function(event) {
    var msg = 'I am the client.';

    console.log('> ' + msg);

    // Send an initial message
    socket.send(msg);

    // Listen for messages
    socket.onmessage = function(event) {
        console.log('< ' + event.data);
    };

    // Listen for socket closes
    socket.onclose = function(event) {
        console.log('Client notified socket has closed', event);
    };

    // To close the socket....
    //socket.close()

};
</script>
<body>
<p>Please check the console log of your browser.</p>
</body>
</html>

Вручную: сначала запустите php server.php в CLI, а затем откройте http://localhost/client.htm в браузере.

Вы можете увидеть результат:

http://localhost/client.htm
> I am the client.
< .tneilc eht ma I

php server.php
< I am the client.
> .tneilc eht ma I

Будьте осторожны, это всего лишь пример кода для тестовой отправки и получения данных, и он не полезен для исполнительной работы.

Я предлагаю вам использовать эти проекты:

https://github.com/ghedipunk/PHP-Websockets
https://github.com/esromneb/phpwebsocket
https://github.com/acbrandao/PHP/tree/master/ws
https://github.com/srchea/PHP-Push-WebSocket/
http://socketo.me/

А также я предлагаю вам эти статьи для более подробной информации:

http://www.abrandao.com/2013/06/websockets-html5-php/
http://cuelogic.com/blog/php-and-html5-websocket-server-and-client-communication/
http://srchea.com/build-a-real-time-application-using-html5-websockets

0 голосов
/ 26 июля 2011

Я ничего не знаю о том, что обеспечивает произвольные возможности сокетов для JS.Ограничена поддержка веб-сокетов (что, я думаю, потребует от вас изменения сервера, чтобы он соответствовал пространству).В противном случае простой XHR может удовлетворить ваши потребности (что потребует изменения сервера для работы в качестве веб-службы).Если служба работает на другом источнике страницы, вам нужно будет использовать CORS или использовать обходной путь, например JSONP .

0 голосов
/ 28 августа 2012

Попробуйте это:

http://code.google.com/p/phpwebsocket/

0 голосов
/ 26 июля 2011

Короче говоря - вы не можете этого сделать - было бы брешей в безопасности позволить клиентскому коду открывать сокетные соединения.

Однако вы можете смоделировать это - отправить свои данные на другую страницу PHP в виде AJAX-запроса, а затем заставить эту страницу PHP взаимодействовать через сокет.

Обновление 2017 :

В то же время, паутины стали вещью. Обратите внимание, что протокол websocket отличается от общих сетевых сокетов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...