PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Страниц (2): [1] 2 »
Найдено сообщений: 30
dvd2444
Отправлено: 25 Июля, 2014 - 16:39:38 • Тема: Работа кода на локальном компьютере и на хостинге • Форум: Вопросы новичков
Ответов: 3 Просмотров: 269
Если после 56 строки добавить это
PHP:
скопировать код в буфер обмена
// проверка подключен ли пользователь
if ( $bytes == 0 )
{
// удаление клиента из массива
$this -> close ( $read_sock ) ;
break ;
}
то пользователи не выходят все сразу а выходят как положено, но тогда для отправки сообщения его нужно писать 2 раза, что это за ерунда такая, не могу понять почему в первом варианте не работает
dvd2444
Отправлено: 25 Июля, 2014 - 12:47:36 • Тема: Работа кода на локальном компьютере и на хостинге • Форум: Вопросы новичков
Ответов: 3 Просмотров: 269
DeepVarvar Расположил код на бесплатном VPS хостинге https://vps[dot]ua[dot]До этого код отлично работал на локалхосте. Теперь когда я открываю несколько вкладок с пользователями http://31[dot]131[dot]24[dot]172/client[dot]html а потом закрываю одну, выходят все пользователи
Код сервера
PHP:
скопировать код в буфер обмена
<?PHP
class testserver
{
var $host ;
var $port ;
var $socket ;
var $model ;
public static $clients ;
function __construct( $host , $port )
{
$this -> host = $host ;
$this -> port = $port ;
$this -> socket = null ;
$this -> model = new Model_server( ) ;
}
public function run( ) //Запуск сервера
{
$this -> start ( ) ;
$this -> clients = array ( $this -> socket ) ; $null = null ;
do
{
$read = $this -> clients ;
if ( socket_select ( $read , $write = NULL , $except = NULL , 0 ) < 1 ) //ждем нового события {
continue ;
}
if ( in_array ( $this -> socket , $read ) ) //принимаем новые подключения {
// accept the client, and add him to the $clients array
// send the client a welcome message
$this -> handshake ( $data , $newsock ) ;
$msg = $newsock . " connected to the server" ;
$this -> send ( $msg ) ;
$msg = "<hr>" . $msg . "<hr>\n " ;
$this -> console ( $msg ) ;
//socket_getpeername($newsock, $ip);
//echo " Client ip: {$ip}\n<hr>";
// remove the listening socket from the clients-with-data array
}
foreach ( $read as $read_sock )
{
// проверка подключен ли пользователь
if ( $data === false )
{
// удаление клиента из массива
$this -> close ( $read_sock ) ;
break ;
}
{
echo "2" ;
$this -> close ( $read_sock ) ;
break ;
}
else
{
// декодируем сообщение
$data = $this -> decode ( $data ) ;
if ( $data [ 'payload' ] == 'close' )
{
$this -> close ( $read_sock ) ;
continue ;
}
elseif ( $data [ 'payload' ] == "online" )
{
$this -> console ( count ( $this -> clients ) . " users online<br />\n " ) ; $this -> sendMessage ( count ( $this -> clients ) . " users online" , $read_sock ) ; }
else
{
if ( $data [ 'payload' ] != "" )
{
$msg = trim ( $data [ 'payload' ] ) ; if ( $msg != ' ' && $msg != "" )
{
$msg = $read_sock . " Say: " . $msg ;
$this -> send ( $msg ) ;
$this -> console ( $msg . "<br />\n " ) ;
}
}
}
}
}
}
while ( true ) ;
end : //точка выхода из приложения(остановка сервера) //
$this -> shutdown ( ) ;
}
//////////////////////////////////////////////////////////////
private function send( $msg , $type = 'text' , $masked = false ) //Отправка сообщения пользователю
{
$msg = $this -> encode ( $msg , $type , $masked ) ;
$i = 1 ;
$num = 0 ;
foreach ( $this -> clients as $read_sock )
{
if ( $num >= 1)
{
}
$num ++;
}
}
/////////////////////////////////////////////////////////////
private function sendMessage( $msg , $read_sock , $type = 'text' , $masked = false ) //Отправка сообщения пользователю
{
$msg = $this -> encode ( $msg , $type , $masked ) ;
}
//////////////////////////////////////////////////////////////
private function close( $read_sock ) //Закрывает конкретное соединение
{
{
echo "1" ;
//socket_close($read_sock);
{
unset ( $this -> clients [ $key ] ) ; }
//$this->console($read_sock." Disconnected <br />");
//$this->send($read_sock." Disconnected");
}
}
//////////////////////////////////////////////////////////////
private function shutdown( ) //Остановка всего сервера
{
if ( isset ( $this -> socket ) ) {
$this -> console ( "<br /><hr>Server shutdown---OK <br /><hr>" ) ;
return ;
}
}
//////////////////////////////////////////////////////////////
private function start( )
{
$this -> console ( "-=SERVER v2.1=-<hr>\n " ) ;
$this -> console ( "Socket create ------" ) ;
if ( ( $this -> socket = socket_create ( AF_INET
, SOCK_STREAM
, SOL_TCP
) ) === false ) {
}
else
{
$this -> console ( "OK<br />\n " ) ;
}
$this -> console ( "Socket bind --------" ) ;
//привязываем его к указанным ip и порту
if ( ( socket_bind ( $this -> socket , $this -> host , $this -> port ) ) === false ) {
}
else
{
$this -> console ( "OK <br />\n " ) ;
}
socket_set_option ( $this -> socket , SOL_SOCKET
, SO_REUSEADDR
, 1
) ; //разрешаем использовать один порт для нескольких соединений
$this -> console ( "Socket listening-----" ) ;
{
}
else
{
$this -> console ( "OK <br />\n " ) ;
}
$this -> console ( "Server started-------OK<hr>\n " ) ;
//
}
//////////////////////////////////////////////////////////////
private function handshake( $receved_header , $client_conn ) //выполняет рукопожатие сервера и клиента
{
foreach ( $lines as $line )
{
if ( preg_match ( '/\A(\S+): (.*)\z/' , $line , $matches ) ) {
$headers [ $matches [ 1] ] = $matches [ 2] ;
}
}
$secKey = $headers [ 'Sec-WebSocket-Key' ] ;
//hand shaking header
$upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r \n " .
"Upgrade: websocket\r \n " .
"Connection: Upgrade\r \n " .
"Sec-WebSocket-Origin: http://$this->host \r \n " .
"Sec-WebSocket-Location: ws://$this->host :$this->port \r \n " .
"Sec-WebSocket-Accept: $secAccept \r \n \r \n " ;
}
//////////////////////////////////////////////////////////////
private function decode( $data ) //Декорирует сообщение пришедшее от пользователся
{
$payloadLength = '' ;
$mask = '' ;
$unmaskedPayload = '' ;
// estimate frame type:
$firstByteBinary = sprintf ( '%08b' , ord ( $data [ 0
] ) ) ; $secondByteBinary = sprintf ( '%08b' , ord ( $data [ 1
] ) ) ; $isMasked = ( $secondByteBinary [ 0 ] == '1' ) ? true : false ;
$payloadLength = ord ( $data [ 1
] ) & 127 ;
// close connection if unmasked frame is received:
if ( $isMasked === false )
{
//$this->close(1002);
}
switch ( $opcode )
{
// text frame:
case 1:
$decodedData [ 'type' ] = 'text' ;
break ;
case 2:
$decodedData [ 'type' ] = 'binary' ;
break ;
// connection close frame:
case 8:
$decodedData [ 'type' ] = 'close' ;
break ;
// ping frame:
case 9:
$decodedData [ 'type' ] = 'ping' ;
break ;
// pong frame:
case 10:
$decodedData [ 'type' ] = 'pong' ;
break ;
default :
// Close connection on unknown opcode:
//$this->close(1003);
break ;
}
if ( $payloadLength === 126)
{
$payloadOffset = 8 ;
}
elseif ( $payloadLength === 127)
{
$payloadOffset = 14 ;
$tmp = '' ;
for ( $i = 0 ; $i < 8 ; $i ++ )
{
}
$dataLength = bindec ( $tmp ) + $payloadOffset ; }
else
{
$payloadOffset = 6 ;
$dataLength = $payloadLength + $payloadOffset ;
}
/**
* We have to check for large frames here. socket_recv cuts at 1024 bytes
* so if websocket-frame is > 1024 bytes we have to wait until whole
* data is transferd.
*/
if ( strlen ( $data ) < $dataLength ) {
return false ;
}
if ( $isMasked === true )
{
for ( $i = $payloadOffset ; $i < $dataLength ; $i ++ )
{
$j = $i - $payloadOffset ;
{
$unmaskedPayload .= $data [ $i ] ^ $mask [ $j % 4] ;
}
}
$decodedData [ 'payload' ] = $unmaskedPayload ;
}
else
{
$payloadOffset = $payloadOffset - 4 ;
$decodedData [ 'payload' ] = substr ( $data , $payloadOffset ) ; }
return $decodedData ;
}
//////////////////////////////////////////////////////////////
private function encode( $payload , $type , $masked ) //Кодирует сообщение перед отправкой пользователю
{
$frame = '' ;
$payloadLength = strlen ( $payload ) ;
switch ( $type )
{
case 'text' :
// first byte indicates FIN, Text-Frame (10000001):
$frameHead [ 0] = 129 ;
break ;
case 'close' :
// first byte indicates FIN, Close Frame(10001000):
$frameHead [ 0] = 136 ;
break ;
case 'ping' :
// first byte indicates FIN, Ping frame (10001001):
$frameHead [ 0] = 137 ;
break ;
case 'pong' :
// first byte indicates FIN, Pong frame (10001010):
$frameHead [ 0] = 138 ;
break ;
}
// set mask and payload length (using 1, 3 or 9 bytes)
if ( $payloadLength > 65535)
{
$frameHead [ 1] = ( $masked === true ) ? 255 : 127 ;
for ( $i = 0 ; $i < 8 ; $i ++ )
{
$frameHead [ $i + 2
] = bindec ( $payloadLengthBin [ $i ] ) ; }
// most significant bit MUST be 0 (close connection if frame too big)
if ( $frameHead [ 2] > 127)
{
$this -> close ( 1004) ;
return false ;
}
}
elseif ( $payloadLength > 125)
{
$frameHead [ 1] = ( $masked === true ) ? 254 : 126 ;
$frameHead [ 2
] = bindec ( $payloadLengthBin [ 0
] ) ; $frameHead [ 3
] = bindec ( $payloadLengthBin [ 1
] ) ; }
else
{
$frameHead [ 1] = ( $masked === true ) ? $payloadLength + 128 : $payloadLength ;
}
// convert frame-head to string:
{
$frameHead [ $i ] = chr ( $frameHead [ $i ] ) ; }
if ( $masked === true )
{
// generate a random mask:
for ( $i = 0 ; $i < 4 ; $i ++ )
{
}
}
// append payload to frame:
for ( $i = 0 ; $i < $payloadLength ; $i ++ )
{
$frame .= ( $masked === true ) ? $payload [ $i ] ^ $mask [ $i % 4] : $payload [ $i ] ;
}
return $frame ;
}
}
dvd2444
Отправлено: 24 Июля, 2014 - 17:42:00 • Тема: Работа кода на локальном компьютере и на хостинге • Форум: Вопросы новичков
Ответов: 3 Просмотров: 269
Есть код который отлично работает на локалхосте, но при переносе его на сервер криво стали работать некоторые функции связанные с веб сокетами(при выходе одного пользователя отключаются все соединения пользователей). Конфигурация рнр на сервере такая же как и на хостинге. Что может влиять на работу кода?
dvd2444
Отправлено: 21 Июля, 2014 - 22:23:29 • Тема: Прерывание websocket соединения • Форум: Работа с сетью
Ответов: 0 Просмотров: 1160
Есть сервер к которому подключаются пользователи по веб сокет соединению.Если пользователь закрывает вкладку браузера у всех остальных должно выпасть сообщение что конкретный пользователь вышел.Но у меня при выходе одного юзера выключаются все активные соединения.Прошу помощи, вот код.Функция отключения пользователя на 142 строке
PHP:
скопировать код в буфер обмена
<?PHP
class Server
{
var $host ;
var $port ;
var $socket ;
var $model ;
var $clients ;
function __construct( $host , $port )
{
$this -> host = $host ;
$this -> port = $port ;
$this -> socket = null ;
$this -> model = new Model_server( ) ;
}
public function run( ) //Запуск сервера
{
$this -> start ( ) ;
$this -> clients = array ( $this -> socket ) ; $null = null ;
do
{
$read = $this -> clients ;
if ( socket_select ( $read , $write = NULL , $except = NULL , 0 ) < 1 ) //ждем нового события {
continue ;
}
if ( in_array ( $this -> socket , $read ) ) //принимаем новые подключения {
// accept the client, and add him to the $clients array
// send the client a welcome message
$this -> handshake ( $data , $newsock ) ;
$msg = $newsock . " connected to the server" ;
$this -> send ( $msg ) ;
$msg = "<hr>" . $msg . "<hr>\n " ;
$this -> console ( $msg ) ;
//socket_getpeername($newsock, $ip);
//echo " Client ip: {$ip}\n<hr>";
// remove the listening socket from the clients-with-data array
}
foreach ( $read as $read_sock )
{
{
continue ;
}
// проверка подключен ли пользователь
if ( $data === false )
{
// удаление клиента из массива
$this -> close ( $read_sock ) ;
continue ;
}
else
{
// декодируем сообщение
$data = $this -> decode ( $data ) ;
$msg = explode ( ":" , $data [ 'payload' ] ) ;
if ( $data [ 'payload' ] == 'close' )
{
$this -> close ( $read_sock ) ;
continue ;
}
elseif ( $data [ 'payload' ] == "online" )
{
$this -> console ( count ( $this -> clients ) . " users online<br />\n " ) ; $this -> sendMessage ( count ( $this -> clients ) . " users online" , $read_sock ) ; }
else
{
if ( $data [ 'payload' ] != "" )
{
$msg = trim ( $data [ 'payload' ] ) ; if ( $msg != ' ' && $msg != "" )
{
$msg = $read_sock . " Say: " . $msg ;
$this -> send ( $msg ) ;
$this -> console ( $msg . "<br />\n " ) ;
}
}
}
}
}
$this -> event ( ) ;
}
while ( true ) ;
//
$this -> shutdown ( ) ;
}
//////////////////////////////////////////////////////////////
private function console( $msg , $decode = false ) //вывод сообщения присланные клиентом на сервере
{
echo iconv ( 'windows-1251' , 'utf-8' , $msg ) ; }
//////////////////////////////////////////////////////////////
private function send( $msg , $type = 'text' , $masked = false ) //Отправка сообщения пользователю
{
$msg = $this -> encode ( $msg , $type , $masked ) ;
$i = 1 ;
$num = 0 ;
foreach ( $this -> clients as $read_sock )
{
if ( $num >= 1)
{
}
$num ++;
}
}
/////////////////////////////////////////////////////////////
private function sendMessage( $msg , $read_sock , $type = 'text' , $masked = false ) //Отправка сообщения пользователю
{
$msg = $this -> encode ( $msg , $type , $masked ) ;
}
//////////////////////////////////////////////////////////////
private function close( $read_sock ) //Закрывает конкретное соединение
{
{
//socket_close($read_sock);
{
unset ( $this -> clients [ $key ] ) ; }
$this -> console ( $read_sock . " Disconnected <br />" ) ;
$this -> send ( $read_sock . " Disconnected" ) ;
}
}
//////////////////////////////////////////////////////////////
private function shutdown( ) //Остановка всего сервера
{
if ( isset ( $this -> socket ) ) {
$this -> console ( "<br /><hr>Server shutdown---OK <br /><hr>" ) ;
return ;
}
}
//////////////////////////////////////////////////////////////
private function start( )
{
$this -> console ( "-=SERVER v2.1=-<hr>\n " ) ;
$this -> console ( "Socket create ------" ) ;
if ( ( $this -> socket = socket_create ( AF_INET
, SOCK_STREAM
, SOL_TCP
) ) === false ) {
}
else
{
$this -> console ( "OK<br />\n " ) ;
}
$this -> console ( "Socket bind --------" ) ;
//привязываем его к указанным ip и порту
if ( ( socket_bind ( $this -> socket , $this -> host , $this -> port ) ) === false ) {
}
else
{
$this -> console ( "OK <br />\n " ) ;
}
socket_set_option ( $this -> socket , SOL_SOCKET
, SO_REUSEADDR
, 1
) ; //разрешаем использовать один порт для нескольких соединений
$this -> console ( "Socket listening-----" ) ;
{
}
else
{
$this -> console ( "OK <br />\n " ) ;
}
$this -> console ( "Server started-------OK<hr>\n " ) ;
//
}
//////////////////////////////////////////////////////////////
private function handshake( $receved_header , $client_conn ) //выполняет рукопожатие сервера и клиента
{
foreach ( $lines as $line )
{
if ( preg_match ( '/\A(\S+): (.*)\z/' , $line , $matches ) ) {
$headers [ $matches [ 1] ] = $matches [ 2] ;
}
}
$secKey = $headers [ 'Sec-WebSocket-Key' ] ;
//hand shaking header
$upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r \n " .
"Upgrade: websocket\r \n " .
"Connection: Upgrade\r \n " .
"Sec-WebSocket-Origin: http://$this->host \r \n " .
"Sec-WebSocket-Location: ws://$this->host :$this->port \r \n " .
"Sec-WebSocket-Accept: $secAccept \r \n \r \n " ;
}
//////////////////////////////////////////////////////////////
private function decode( $data ) //Декорирует сообщение пришедшее от пользователся
{
$payloadLength = '' ;
$mask = '' ;
$unmaskedPayload = '' ;
// estimate frame type:
$firstByteBinary = sprintf ( '%08b' , ord ( $data [ 0
] ) ) ; $secondByteBinary = sprintf ( '%08b' , ord ( $data [ 1
] ) ) ; $isMasked = ( $secondByteBinary [ 0 ] == '1' ) ? true : false ;
$payloadLength = ord ( $data [ 1
] ) & 127 ;
// close connection if unmasked frame is received:
if ( $isMasked === false )
{
//$this->close(1002);
}
switch ( $opcode )
{
// text frame:
case 1:
$decodedData [ 'type' ] = 'text' ;
break ;
case 2:
$decodedData [ 'type' ] = 'binary' ;
break ;
// connection close frame:
case 8:
$decodedData [ 'type' ] = 'close' ;
break ;
// ping frame:
case 9:
$decodedData [ 'type' ] = 'ping' ;
break ;
// pong frame:
case 10:
$decodedData [ 'type' ] = 'pong' ;
break ;
default :
// Close connection on unknown opcode:
//$this->close(1003);
break ;
}
if ( $payloadLength === 126)
{
$payloadOffset = 8 ;
}
elseif ( $payloadLength === 127)
{
$payloadOffset = 14 ;
$tmp = '' ;
for ( $i = 0 ; $i < 8 ; $i ++ )
{
}
$dataLength = bindec ( $tmp ) + $payloadOffset ; }
else
{
$payloadOffset = 6 ;
$dataLength = $payloadLength + $payloadOffset ;
}
/**
* We have to check for large frames here. socket_recv cuts at 1024 bytes
* so if websocket-frame is > 1024 bytes we have to wait until whole
* data is transferd.
*/
if ( strlen ( $data ) < $dataLength ) {
return false ;
}
if ( $isMasked === true )
{
for ( $i = $payloadOffset ; $i < $dataLength ; $i ++ )
{
$j = $i - $payloadOffset ;
{
$unmaskedPayload .= $data [ $i ] ^ $mask [ $j % 4] ;
}
}
$decodedData [ 'payload' ] = $unmaskedPayload ;
}
else
{
$payloadOffset = $payloadOffset - 4 ;
$decodedData [ 'payload' ] = substr ( $data , $payloadOffset ) ; }
return $decodedData ;
}
//////////////////////////////////////////////////////////////
private function encode( $payload , $type , $masked ) //Кодирует сообщение перед отправкой пользователю
{
$frame = '' ;
$payloadLength = strlen ( $payload ) ;
switch ( $type )
{
case 'text' :
// first byte indicates FIN, Text-Frame (10000001):
$frameHead [ 0] = 129 ;
break ;
case 'close' :
// first byte indicates FIN, Close Frame(10001000):
$frameHead [ 0] = 136 ;
break ;
case 'ping' :
// first byte indicates FIN, Ping frame (10001001):
$frameHead [ 0] = 137 ;
break ;
case 'pong' :
// first byte indicates FIN, Pong frame (10001010):
$frameHead [ 0] = 138 ;
break ;
}
// set mask and payload length (using 1, 3 or 9 bytes)
if ( $payloadLength > 65535)
{
$frameHead [ 1] = ( $masked === true ) ? 255 : 127 ;
for ( $i = 0 ; $i < 8 ; $i ++ )
{
$frameHead [ $i + 2
] = bindec ( $payloadLengthBin [ $i ] ) ; }
// most significant bit MUST be 0 (close connection if frame too big)
if ( $frameHead [ 2 ] > 127 )
{
//$this->close(1004);
return false ;
}
}
elseif ( $payloadLength > 125)
{
$frameHead [ 1] = ( $masked === true ) ? 254 : 126 ;
$frameHead [ 2
] = bindec ( $payloadLengthBin [ 0
] ) ; $frameHead [ 3
] = bindec ( $payloadLengthBin [ 1
] ) ; }
else
{
$frameHead [ 1] = ( $masked === true ) ? $payloadLength + 128 : $payloadLength ;
}
// convert frame-head to string:
{
$frameHead [ $i ] = chr ( $frameHead [ $i ] ) ; }
if ( $masked === true )
{
// generate a random mask:
for ( $i = 0 ; $i < 4 ; $i ++ )
{
}
}
// append payload to frame:
for ( $i = 0 ; $i < $payloadLength ; $i ++ )
{
$frame .= ( $masked === true ) ? $payload [ $i ] ^ $mask [ $i % 4] : $payload [ $i ] ;
}
return $frame ;
}
}
dvd2444
Отправлено: 21 Июля, 2014 - 19:08:30 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков
Ответов: 9 Просмотров: 546
Решением было разместить сервер в интернете.Похоже ява все равно что у вас в файле хост какой то урл переопределен. Нужно покупать впс сервер или хостинг где поддерживается бесконечное исполнение скрипта.
dvd2444
Отправлено: 17 Июля, 2014 - 21:32:55 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков
Ответов: 9 Просмотров: 546
Может ли моя проблема быть связанна с тем что сервер находится на локальной машине?
И как можно проверить была ли попытка в принципе подключиться к серверу?
dvd2444
Отправлено: 16 Июля, 2014 - 21:15:54 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков
Ответов: 9 Просмотров: 546
OrmaJever
CODE (
htmlphp ):
скопировать код в буфер обмена
<? php
class Server
{
var $host ;
var $port ;
var $socket ;
var $model ;
var $clients ;
function __construct( $host , $port )
{
$this -> host = $host ;
$this -> port = $port ;
$this -> socket = null ;
$this -> model = new Model_server( ) ;
}
public function run( ) //Запуск сервера
{
$this -> start ( ) ;
$this -> clients = array ( $this -> socket ) ; $null = null ;
do
{
$read = $this -> clients ;
if ( socket_select ( $read , $write = NULL , $except = NULL , 0 ) < 1 ) //ждем нового события {
continue ;
}
if ( in_array ( $this -> socket , $read ) ) //принимаем новые подключения {
// accept the client, and add him to the $clients array
// send the client a welcome message
$this -> handshake ( $data , $newsock ) ;
$msg = $newsock . " connected to the server" ;
$this -> send ( $msg ) ;
$msg = "<hr>" . $msg . "<hr>\n " ;
$this -> console ( $msg ) ;
//socket_getpeername($newsock, $ip);
//echo " Client ip: {$ip}\n<hr>";
// remove the listening socket from the clients-with-data array
}
foreach ( $read as $read_sock )
{
// проверка подключен ли пользователь
if ( $data === false )
{
// удаление клиента из массива
$this -> close ( $read_sock ) ;
continue ;
}
else
{
// декодируем сообщение
$data = $this -> decode ( $data ) ;
if ( $data [ 'payload' ] == 'close' )
{
$this -> close ( $read_sock ) ;
continue ;
}
elseif ( $data [ 'payload' ] == "online" )
{
$this -> console ( count ( $this -> clients ) . " users online<br />\n " ) ; $this -> sendMessage ( count ( $this -> clients ) . " users online" , $read_sock ) ; }
else
{
if ( $data [ 'payload' ] != "" )
{
$msg = trim ( iconv ( 'utf-8' , 'utf-8' , $data [ 'payload' ] ) ) ; if ( $msg != ' ' && $msg != "" )
{
$msg = $read_sock . " Say: " . $msg ;
$this -> send ( $msg ) ;
$this -> console ( $msg . "<br />\n " ) ;
}
}
}
}
}
}
while ( true ) ;
//
$this -> shutdown ( ) ;
}
//////////////////////////////////////////////////////////////
private function console( $msg , $decode = false ) //вывод сообщения присланные клиентом на сервере
{
if ( $decode == false )
{
foreach ( $this -> users as $value )
{
if ( $value -> identificate == "1" )
{
$ms = Server:: encode ( $msg , "text" , false ) ;
}
}
echo $msg ;
}
else
{
$msg = server:: decode ( $data ) ;
echo iconv ( 'windows-1251' , 'utf-8' , $msg ) ; }
}
//////////////////////////////////////////////////////////////
private function send( $msg , $type = 'text' , $masked = false ) //Отправка сообщения пользователю
{
$msg = Server:: encode ( $msg , $type , $masked ) ;
$i = 1 ;
$num = 0 ;
foreach ( $this -> clients as $read_sock )
{
if ( $num >= 1)
{
}
$num ++;
}
}
/////////////////////////////////////////////////////////////
private function sendMessage( $msg , $read_sock , $type = 'text' , $masked = false ) //Отправка сообщения пользователю
{
$msg = Server:: encode ( $msg , $type , $masked ) ;
}
//////////////////////////////////////////////////////////////
private function close( $read_sock ) //Закрывает конкретное соединение
{
{
$this -> console ( $read_sock . " Disconnected <br />" ) ;
$this -> send ( $read_sock . " Disconnected" ) ;
//socket_close($read_sock);
{
unset ( $this -> clients [ $key ] ) ; }
}
}
//////////////////////////////////////////////////////////////
private function shutdown( ) //Остановка всего сервера
{
if ( isset ( $this -> socket ) ) {
$this -> console ( "<br /><hr>Server shutdown---OK <br /><hr>" ) ;
return ;
}
}
//////////////////////////////////////////////////////////////
private function start( )
{
$this -> console ( "-=SERVER v2.1=-<hr>\n " ) ;
$this -> console ( "Socket create ------" ) ;
if ( ( $this -> socket = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP) ) === false ) {
}
else
{
$this -> console ( "OK<br />\n " ) ;
}
$this -> console ( "Socket bind --------" ) ;
//привязываем его к указанным ip и порту
if ( ( socket_bind ( $this -> socket , $this -> host , $this -> port ) ) === false ) {
}
else
{
$this -> console ( "OK <br />\n " ) ;
}
socket_set_option ( $this -> socket , SOL_SOCKET, SO_REUSEADDR, 1) ; //разрешаем использовать один порт для нескольких соединений
$this -> console ( "Socket listening-----" ) ;
{
}
else
{
$this -> console ( "OK <br />\n " ) ;
}
$this -> console ( "Server started-------OK<hr>\n " ) ;
//
}
//////////////////////////////////////////////////////////////
private function handshake( $receved_header , $client_conn ) //выполняет рукопожатие сервера и клиента
{
foreach ( $lines as $line )
{
if ( preg_match ( '/\A(\S+): (.*)\z/' , $line , $matches ) ) {
$headers [ $matches [ 1] ] = $matches [ 2] ;
}
}
$secKey = $headers [ 'Sec-WebSocket-Key' ] ;
//hand shaking header
$upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r \n " .
"Upgrade: websocket\r \n " .
"Connection: Upgrade\r \n " .
"Sec-WebSocket-Origin: http://$this->host \r \n " .
"Sec-WebSocket-Location: ws://$this->host :$this->port \r \n " .
"Sec-WebSocket-Accept: $secAccept \r \n \r \n " ;
}
//////////////////////////////////////////////////////////////
private function decode( $data ) //Декорирует сообщение пришедшее от пользователся
{
$payloadLength = '' ;
$mask = '' ;
$unmaskedPayload = '' ;
// estimate frame type:
$firstByteBinary = sprintf ( '%08b' , ord ( $data [ 0] ) ) ; $secondByteBinary = sprintf ( '%08b' , ord ( $data [ 1] ) ) ; $isMasked = ( $secondByteBinary [ 0 ] == '1' ) ? true : false ;
$payloadLength = ord ( $data [ 1] ) & 127 ;
// close connection if unmasked frame is received:
if ( $isMasked === false )
{
$this -> close ( 1002) ;
}
switch ( $opcode )
{
// text frame:
case 1:
$decodedData [ 'type' ] = 'text' ;
break ;
case 2:
$decodedData [ 'type' ] = 'binary' ;
break ;
// connection close frame:
case 8:
$decodedData [ 'type' ] = 'close' ;
break ;
// ping frame:
case 9:
$decodedData [ 'type' ] = 'ping' ;
break ;
// pong frame:
case 10:
$decodedData [ 'type' ] = 'pong' ;
break ;
default :
// Close connection on unknown opcode:
$this -> close ( 1003) ;
break ;
}
if ( $payloadLength === 126)
{
$payloadOffset = 8 ;
}
elseif ( $payloadLength === 127)
{
$payloadOffset = 14 ;
$tmp = '' ;
for ( $i = 0 ; $i < 8 ; $i ++ )
{
}
$dataLength = bindec ( $tmp ) + $payloadOffset ; }
else
{
$payloadOffset = 6 ;
$dataLength = $payloadLength + $payloadOffset ;
}
/**
* We have to check for large frames here. socket_recv cuts at 1024 bytes
* so if websocket-frame is > 1024 bytes we have to wait until whole
* data is transferd.
*/
if ( strlen ( $data ) < $dataLength ) {
return false ;
}
if ( $isMasked === true )
{
for ( $i = $payloadOffset ; $i < $dataLength ; $i ++ )
{
$j = $i - $payloadOffset ;
{
$unmaskedPayload .= $data [ $i ] ^ $mask [ $j % 4] ;
}
}
$decodedData [ 'payload' ] = $unmaskedPayload ;
}
else
{
$payloadOffset = $payloadOffset - 4 ;
$decodedData [ 'payload' ] = substr ( $data , $payloadOffset ) ; }
return $decodedData ;
}
//////////////////////////////////////////////////////////////
private function encode( $payload , $type , $masked ) //Кодирует сообщение перед отправкой пользователю
{
$frame = '' ;
$payloadLength = strlen ( $payload ) ;
switch ( $type )
{
case 'text' :
// first byte indicates FIN, Text-Frame (10000001):
$frameHead [ 0] = 129 ;
break ;
case 'close' :
// first byte indicates FIN, Close Frame(10001000):
$frameHead [ 0] = 136 ;
break ;
case 'ping' :
// first byte indicates FIN, Ping frame (10001001):
$frameHead [ 0] = 137 ;
break ;
case 'pong' :
// first byte indicates FIN, Pong frame (10001010):
$frameHead [ 0] = 138 ;
break ;
}
// set mask and payload length (using 1, 3 or 9 bytes)
if ( $payloadLength > 65535)
{
$frameHead [ 1] = ( $masked === true ) ? 255 : 127 ;
for ( $i = 0 ; $i < 8 ; $i ++ )
{
$frameHead [ $i + 2] = bindec ( $payloadLengthBin [ $i ] ) ; }
// most significant bit MUST be 0 (close connection if frame too big)
if ( $frameHead [ 2] > 127)
{
$this -> close ( 1004) ;
return false ;
}
}
elseif ( $payloadLength > 125)
{
$frameHead [ 1] = ( $masked === true ) ? 254 : 126 ;
$frameHead [ 2] = bindec ( $payloadLengthBin [ 0] ) ; $frameHead [ 3] = bindec ( $payloadLengthBin [ 1] ) ; }
else
{
$frameHead [ 1] = ( $masked === true ) ? $payloadLength + 128 : $payloadLength ;
}
// convert frame-head to string:
{
$frameHead [ $i ] = chr ( $frameHead [ $i ] ) ; }
if ( $masked === true )
{
// generate a random mask:
for ( $i = 0 ; $i < 4 ; $i ++ )
{
}
}
// append payload to frame:
for ( $i = 0 ; $i < $payloadLength ; $i ++ )
{
$frame .= ( $masked === true ) ? $payload [ $i ] ^ $mask [ $i % 4] : $payload [ $i ] ;
}
return $frame ;
}
}
dvd2444
Отправлено: 16 Июля, 2014 - 17:32:41 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков
Ответов: 9 Просмотров: 546
OrmaJever Ну вот ява клиент
CODE (
htmlphp ):
скопировать код в буфер обмена
package com. example. ws1;
import android. app. Activity;
import android. os. Bundle;
import android. view. View;
import android. view. View. OnClickListener;
import android. widget. Button;
import android. widget. TextView;
import de. tavendo. autobahn. WebSocketConnection;
import de. tavendo. autobahn. WebSocketException;
import de. tavendo. autobahn. WebSocketHandler;
public class MainActivity extends Activity implements OnClickListener
{
Button but;
TextView textView2;
private static final String TAG = "myLogs" ;
private final WebSocketConnection mConnection = new WebSocketConnection( ) ;
@ Override
protected void onCreate( Bundle savedInstanceState)
{
super. onCreate( savedInstanceState) ;
setContentView( R. layout. activity_main) ;
textView2 = ( TextView) findViewById( R. id. textView2) ;
but = ( Button) findViewById( R. id. but) ;
but. setOnClickListener( this) ;
}
public void onClick( View v)
{
switch ( v. getId( ) )
{
case R. id. but:
//final String mWsUrl = "ws://echo.websocket.org"; ws://ws:2223/server.php
final String wsuri = "ws://ws:2223/server.php" ;
try {
textView2. setText( "1111" ) ;
mConnection. connect( wsuri, new WebSocketHandler( ) {
@ Override
public void onOpen( )
{
Log . d
( TAG
, "Status: Connected to " + wsuri
) ; //mConnection.sendTextMessage("connect_i:qwe");
textView2. setText( "Status: Connected to " + wsuri) ;
}
@ Override
public void onTextMessage( String payload)
{
Log . d
( TAG
, "Got echo: " + payload
) ; textView2. setText( "Got echo: " + payload) ;
}
@ Override
public void onClose( int code, String reason)
{
Log . d
( TAG
, "Connection lost." ) ; textView2. setText( "12222" ) ;
}
} ) ;
}
catch ( WebSocketException e)
{
Log . d
( TAG
, e
. toString
( ) ) ; }
break ;
default :
break ;
}
}
}
Код сервера скидывать не хочется, ибо там около 500 строк.Но с рукопожатием на моем
сервере все в порядке
dvd2444
Отправлено: 16 Июля, 2014 - 17:13:10 • Тема: Web Sockets ява и рнр • Форум: Вопросы новичков
Ответов: 9 Просмотров: 546
Есть сервер на веб сокетах, который отлично подключает клиентов на ява скрипте, но такой же клиент на яве не подключается, хотя если клиент на ява подключается по адресу(ws://echo.websocket.org) все работает хорошо, в чем может быть проблема?
dvd2444
Отправлено: 09 Июля, 2014 - 15:09:48 • Тема: Веб сокеты • Форум: Вопросы новичков
Ответов: 33 Просмотров: 4396
Можете разъяснить некоторые моменты в коде?
PHP:
скопировать код в буфер обмена
public function run( ) //Запуск сервера
{
$this -> start ( ) ; //Функция создает сокет
$this -> clients = array ( $this -> socket ) ; //создаю массив пользователей
$null = null ;
do
{
$read = $this -> clients ;
if ( socket_select ( $read , $write = NULL , $except = NULL , 0 ) < 1 ) //ждем каких либо действий {
continue ;
}
{
$this -> clients [ ] = $newsock = socket_accept ( $this -> socket ) ; //создаем новое подключение
$this -> handshake ( $data , $newsock ) ; //выполняем рукопожатие
$msg = $newsock . " connected to the server" ;
$this -> send ( $msg ) ; //отпраляем пользователям сообщение
$msg = "<hr>" . $msg . "<hr>" ;
$this -> console ( $msg ) ;
$key = array_search ( $this -> socket , $read ) ; //Вот здесь появляется непонимание.Для чего удалять созданное подключение? unset ( $read [ $key ] ) ; //Если эти строки удалить, то подключение нескольких юзеров одновременно не возможно }
foreach ( $read as $read_sock ) // перебираем все подключения
{
$data = socket_read ( $read_sock , 1024
) ; //считвываем сообщения от всех пользоателей
if ( $data === false ) //если пользователь отключился вызываем фцию отключения
{
// remove client for $clients array
$this -> close ( $read_sock ) ;
continue ;
}
else
{
$data = $this -> decode ( $data ) ;
if ( $data [ 'payload' ] == 'close' )
{
$this -> close ( $read_sock ) ;
continue ;
}
$data [ 'payload' ] = $read_sock . " Say: " . $data [ 'payload' ] ;
$this -> send ( $data [ 'payload' ] ) ;
$this -> console ( $data [ 'payload' ] . "<br />" ) ; //отправляем сообщение пользователю
}
}
} while ( true ) ;
Еще есть проблема с тем, что когда я закрываю страницу браузера с активным подключением отключаются все пользователи и больше подключиться не удается(хотя сервер не останавливается)
dvd2444
Отправлено: 07 Июля, 2014 - 16:06:27 • Тема: Веб сокеты • Форум: Вопросы новичков
Ответов: 33 Просмотров: 4396
esterio Спасибо, понял.Но все же хотелось бы самому наступить на все грабли что бы понимание пришло, у меня так происходит обучение, пока свой велосипед не напишу с мертвой точки не сдвинусь
dvd2444
Отправлено: 07 Июля, 2014 - 14:57:45 • Тема: Веб сокеты • Форум: Вопросы новичков
Ответов: 33 Просмотров: 4396
OrmaJever Возможно он имеет в виду что я глупый дядька и пишу на коленке за 5 минут
(Добавление)
Всем спасибо за помощь, все заработало, вот рабочий код(может кому понадобится).Теперь буду углубляться.
PHP:
скопировать код в буфер обмена
<?PHP
//header('Content-Type: text/plain;');
$host = "websocket.ru" ;
$port = 1233 ;
echo "-=SERVER v2.0=-<hr><br />" ;
echo "Socket create----" ;
if ( ( $socket = socket_create ( AF_INET
, SOCK_STREAM
, SOL_TCP
) ) === false ) {
//exit();
}
else
{
echo "OK<br />" ;
}
echo "Socket bind------" ;
//привязываем его к указанным ip и порту
{
//exit();
}
else
{
echo "OK <br />\r \n " ;
}
socket_set_option ( $socket , SOL_SOCKET
, SO_REUSEADDR
, 20
) ; //разрешаем использовать один порт для нескольких соединений
echo "Socket listening--" ;
{
}
else
{
echo "OK <br />\r \n <hr>" ;
}
while ( true )
{
echo "Client connected--" ;
if ( $accept === false )
{
}
else
{
echo "OK <br />" ;
}
$msg = socket_read ( $accept , 1024
) ; //считываем заголовки
perform_handshaking( $msg , $accept ) ; //производим рукопожатие
echo "Headers sends----OK<br />" ;
do
{
{
}
else
{
echo "Read socket---OK" ;
}
$data = hybi10Decode( $data ) ;
$data = hybi10Encode( $data [ 'payload' ] ) ;
break 2 ;
}
while ( true ) ;
}
close( $socket ) ;
///// ///// ///////
function close( $socket )
{
{
echo "<br /><hr>Close connection--" ;
echo "OK <br />" ;
}
}
function perform_handshaking( $receved_header , $client_conn )
{
foreach ( $lines as $line )
{
if ( preg_match ( '/\A(\S+): (.*)\z/' , $line , $matches ) ) {
$headers [ $matches [ 1] ] = $matches [ 2] ;
}
}
$secKey = $headers [ 'Sec-WebSocket-Key' ] ;
//hand shaking header
$upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r \n " .
"Upgrade: websocket\r \n " .
"Connection: Upgrade\r \n " .
"Sec-WebSocket-Origin: http://websocket.ru\r \n " .
"Sec-WebSocket-Location: ws://websocket.ru:1233\r \n " .
"Sec-WebSocket-Accept: $secAccept \r \n \r \n " ;
}
function hybi10Encode( $payload , $type = 'text' , $masked = false )
{
$frame = '' ;
$payloadLength = strlen ( $payload ) ;
switch ( $type )
{
case 'text' :
// first byte indicates FIN, Text-Frame (10000001):
$frameHead [ 0] = 129 ;
break ;
case 'close' :
// first byte indicates FIN, Close Frame(10001000):
$frameHead [ 0] = 136 ;
break ;
case 'ping' :
// first byte indicates FIN, Ping frame (10001001):
$frameHead [ 0] = 137 ;
break ;
case 'pong' :
// first byte indicates FIN, Pong frame (10001010):
$frameHead [ 0] = 138 ;
break ;
}
// set mask and payload length (using 1, 3 or 9 bytes)
if ( $payloadLength > 65535)
{
$frameHead [ 1] = ( $masked === true ) ? 255 : 127 ;
for ( $i = 0 ; $i < 8 ; $i ++ )
{
$frameHead [ $i + 2
] = bindec ( $payloadLengthBin [ $i ] ) ; }
// most significant bit MUST be 0 (close connection if frame too big)
if ( $frameHead [ 2] > 127)
{
$this -> close ( 1004) ;
return false ;
}
}
elseif ( $payloadLength > 125)
{
$frameHead [ 1] = ( $masked === true ) ? 254 : 126 ;
$frameHead [ 2
] = bindec ( $payloadLengthBin [ 0
] ) ; $frameHead [ 3
] = bindec ( $payloadLengthBin [ 1
] ) ; }
else
{
$frameHead [ 1] = ( $masked === true ) ? $payloadLength + 128 : $payloadLength ;
}
// convert frame-head to string:
{
$frameHead [ $i ] = chr ( $frameHead [ $i ] ) ; }
if ( $masked === true )
{
// generate a random mask:
for ( $i = 0 ; $i < 4 ; $i ++ )
{
}
}
// append payload to frame:
for ( $i = 0 ; $i < $payloadLength ; $i ++ )
{
$frame .= ( $masked === true ) ? $payload [ $i ] ^ $mask [ $i % 4] : $payload [ $i ] ;
}
return $frame ;
}
function hybi10Decode( $data )
{
$payloadLength = '' ;
$mask = '' ;
$unmaskedPayload = '' ;
// estimate frame type:
$firstByteBinary = sprintf ( '%08b' , ord ( $data [ 0
] ) ) ; $secondByteBinary = sprintf ( '%08b' , ord ( $data [ 1
] ) ) ; $isMasked = ( $secondByteBinary [ 0 ] == '1' ) ? true : false ;
$payloadLength = ord ( $data [ 1
] ) & 127 ;
// close connection if unmasked frame is received:
if ( $isMasked === false )
{
$this -> close ( 1002) ;
}
switch ( $opcode )
{
// text frame:
case 1:
$decodedData [ 'type' ] = 'text' ;
break ;
case 2:
$decodedData [ 'type' ] = 'binary' ;
break ;
// connection close frame:
case 8:
$decodedData [ 'type' ] = 'close' ;
break ;
// ping frame:
case 9:
$decodedData [ 'type' ] = 'ping' ;
break ;
// pong frame:
case 10:
$decodedData [ 'type' ] = 'pong' ;
break ;
default :
// Close connection on unknown opcode:
$this -> close ( 1003) ;
break ;
}
if ( $payloadLength === 126)
{
$payloadOffset = 8 ;
}
elseif ( $payloadLength === 127)
{
$payloadOffset = 14 ;
$tmp = '' ;
for ( $i = 0 ; $i < 8 ; $i ++ )
{
}
$dataLength = bindec ( $tmp ) + $payloadOffset ; }
else
{
$payloadOffset = 6 ;
$dataLength = $payloadLength + $payloadOffset ;
}
/**
* We have to check for large frames here. socket_recv cuts at 1024 bytes
* so if websocket-frame is > 1024 bytes we have to wait until whole
* data is transferd.
*/
if ( strlen ( $data ) < $dataLength ) {
return false ;
}
if ( $isMasked === true )
{
for ( $i = $payloadOffset ; $i < $dataLength ; $i ++ )
{
$j = $i - $payloadOffset ;
{
$unmaskedPayload .= $data [ $i ] ^ $mask [ $j % 4] ;
}
}
$decodedData [ 'payload' ] = $unmaskedPayload ;
}
else
{
$payloadOffset = $payloadOffset - 4 ;
$decodedData [ 'payload' ] = substr ( $data , $payloadOffset ) ; }
return $decodedData ;
}
И клиент
CODE (
htmlphp ):
скопировать код в буфер обмена
 <!DOCTYPE html>
<!--
To change this license header , choose License Headers in Project Properties. To change this template file , choose Tools | Templates and open the template in the editor.
-->
< html>
< head>
< title> Client</ title>
< meta charset= "UTF-8" >
< meta name= "viewport" content= "width=device-width, initial-scale=1.0" >
< style type= "text/css" >
html, body {
font: normal 0. 9em arial, helvetica;
}
#log {
width: 400px;
height: 350px;
border: 1px solid #7F9DB9;
overflow: auto;
}
#msg {
width: 400px;
}
</ style>
< script type= "text/javascript" >
var socket;
function init( ) {
var host = 'ws://websocket.ru:1233/server.php' ; // 'ws://echo.websocket.org'
try {
socket = new WebSocket( host) ;
log ( 'WebSocket - status ' + socket. readyState) ; socket. onopen = function( msg) {
log ( "Welcome - status " + this. readyState) ; } ;
socket. onmessage = function( msg) {
log ( "Received: " + msg. data) ; } ;
socket. onclose = function( msg) {
log ( "Disconnected - status " + this. readyState) ; } ;
}
catch( ex) {
}
$( "msg" ) . focus( ) ;
}
function send( ) {
var txt, msg;
txt = $( "msg" ) ;
msg = txt. value;
if ( ! msg) {
alert( "Message can not be empty" ) ;
return ;
}
txt. value= "" ;
txt. focus( ) ;
try {
socket. send( msg) ;
} catch( ex) {
}
}
function quit( ) {
if ( socket != null ) {
socket. close( ) ;
socket= null ;
}
}
function reconnect( ) {
quit( ) ;
init( ) ;
}
// Utilities
function $( id) { return document. getElementById( id) ; }
function log ( msg) { $( "log" ) . innerHTML+= "<br>" + msg; } function onkey( event) { if ( event. keyCode== 13) { send( ) ; } }
</ script>
</ head>
< body onload= "init()" >
< h3> WebSocket v1.0</ h3>
< div id= "log" ></ div>
< input id= "msg" type= "text" onkeypress= "onkey(event)" />
< button onclick= "send()" > Send</ button>
< button onclick= "quit()" > Quit</ button>
< button onclick= "reconnect()" > Reconnect</ button>
</ body>
</ html>
Страниц (2): [1] 2 »
Powered by ExBB FM 1.0 RC1. InvisionExBB