Как клиент Javascript может подключиться к серверу сокетов PHp?
Привет у меня есть работающий сервер сокетов, написанный на PHP.
сервер прослушивает соединения.. есть идеи, как мой клиент (написанный на javascript) собирается подключиться к серверу и отправить на него данные?
PS: Я знаю только, как подключить php-клиент к серверу сокетов, но не уверен, как подключить клиент javascript.
спасибо всем за ваше время.
5 ответов
коротко говоря - вы не можете этого сделать - это было бы нарушением безопасности, чтобы позволить клиентскому коду открывать соединения сокетов.
однако вы можете имитировать это-отправить свои данные на другую страницу PHP в качестве запроса AJAX, а затем сделать эту страницу PHP связью через сокет.
обновление 2017:
в то же время, websockets стал вещью. Обратите внимание, что протокол websocket отличается от generic сетевые сокеты
отвечая на старый вопрос, если люди найдут его, как я сделал через Google.
В настоящее время почти все современные браузеры поддерживают WebSocket Javascript API. Через WS клиент JS в браузере может открывать дуплексные сокеты для severs, написанных на PHP или других языках. Сервер должен реализовать протокол WS, но теперь существуют библиотеки WS для PHP, Java и других языков.
на данный момент написания, реализации WS все еще кажутся немного движущейся цели, но в настоящее время я работаю с клиентами браузера WS/JS, взаимодействующими с сервером WS/Java, и он, похоже, работает.
предложите Googling для реализаций WS на выбранном вами языке сервера.
надеюсь, что это помогает!
я использую стандарт WebSocket API для клиента. И ядро PHP socket на серверной стороне.
знать, отправлять и получать данные используйте заголовок в браузере с websocket. Но код PHP сокета, отправлять и получать без заголовка и просто отправлять простые данные.
поэтому нам нужно смоделировать заголовок на стороне сервера socketing.
для обучения и знать, как это сделать, я пишу этот четкий пример кода, с помощью этого кода Вы можете отправить фразу сервер и получить обратную фразу, что в клиенте.
сервер.в 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;
}
клиент.НТМ
<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
Я не знаю ничего, что предоставляет произвольные возможности сокета для JS. Существует ограниченная поддержка Web Sockets (который, я думаю, потребует от вас изменить сервер в соответствии с пространством). В противном случае, просто XHR может удовлетворить ваши потребности (что потребует изменения сервера в качестве веб-службы). Если сервис работает на другом происхождении страницы, то вам нужно будет использовать CORS или используйте работу, такую как JSONP.