2011-04-19 12 views
4

다른 입력 창을 기반으로 한 브라우저 창을 업데이트해야하는 경우가 있습니다. 지금은 WebSockets를 사용하고 있으며 잘 작동합니다.프로그래밍 방식으로 WebSocket을 호출하는 방법 (PHP 사용)?

이제 브라우저 대신 PHP를 사용하여 WebSocket에 데이터를 보내려고합니다 (ws : // 대신 PHP 코드 사용). 즉, JavaScript 대신 PHP를 사용하여 WebSocket.send() 호출을 시뮬레이트하고 싶습니다.

if ( 
     function_exists('socket_create') AND 
     $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) AND 
     $sock_data = socket_connect($sock, "127.0.0.1", 12345) 
    ) { 
     $msg = "hello world"; 
     $sock_data = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); //Set 
     $sock_data = socket_write($sock, $msg, strlen($msg)); //Send data 
     socket_close($sock); //Close socket 
    } 

답변

-1

단지 TCP 소켓에 원시 데이터를 보내는 것보다 WebSocket을에 더 많은있다 :

나는 작동하지 않는 다음 코드합니다 (의 onMessage가 호출되지 않는)가 있습니다.

좋아, 시작하려면 웹 소켓이 TCP를 사용하는 UDP 소켓을 사용하고 있습니다. WebSockets는 HTTP와 비슷한 통신 프로토콜입니다. 프로토콜을 따라 가야합니다. 먼저 수행해야하는 핸드 셰이크 단계와 모든 통신에 추가해야하는 헤더가 있습니다. 어려운 것은 아니지만 여기서 자세히 설명하지 않겠습니다.

당신은 PHP에서 WebSocket을 프로토콜을 구현하거나, 같은 사전 구축 된 라이브러리를 사용, 여기에서 두 가지 옵션이 있습니다이 하나 http://code.google.com/p/phpwebsocket/

나는 무례하거나 의미하지만, 미래에, 시도하고 있지 않다 빠른 Google 검색. 내가 연결된 라이브러리는 "PHP WebSockets"로 인터넷 검색을 한 결과 발견되었습니다.

+0

고마워, 실제로 서버로 phpwebsocket을 사용하고 있습니다. 코드를 복사하여 작동 시키려고합니다. 내가 데이터의 "패킷"하나만 보내고 있기 때문에 그보다 더 간단하다고 생각했습니다. – Nightwolf

2

여기에 당신이 일을 끝낼 방법은 다음과 같습니다 소켓에 데이터를 전송하기 위해

http://permalink.gmane.org/gmane.comp.lang.javascript.nodejs/18088

$host = 'localhost'; //where is the websocket server 
$port = 9000; 
$local = "http://localhost/"; //url where this script run 
$data = 'hello world!'; //data to be send 

$head = "GET/HTTP/1.1"."\r\n". 
      "Upgrade: WebSocket"."\r\n". 
      "Connection: Upgrade"."\r\n". 
      "Origin: $local"."\r\n". 
      "Host: $host"."\r\n". 
      "Content-Length: ".strlen($data)."\r\n"."\r\n"; 
//WebSocket handshake 
$sock = fsockopen($host, $port, $errno, $errstr, 2); 
fwrite($sock, $head) or die('error:'.$errno.':'.$errstr); 
$headers = fread($sock, 2000); 
fwrite($sock, "\x00$data\xff") or die('error:'.$errno.':'.$errstr); 
$wsdata = fread($sock, 2000); //receives the data included in the websocket package "\x00DATA\xff" 
fclose($sock); 
1

, 당신은 지정된 포트에서 소켓에 대한 연결을 열 fsockopen를 사용해야합니다. 연결이 성공적으로 완료되면 fwrite

을 사용해야합니다. 그러나 데이터를 WebSocket 서버로 보내야합니다. 서버는 당신을 클라이언트로 취급 할 것이며 인증 성공을 기대하는 HTTP 헤더를 제공하지 않으므로 연결이 거부됩니다.

목표를 알지 못하고 보내는 메시지를받는 사람 (모든 사용자 또는 특정 사용자 또는 완전히 다른 사람)을 말하지 않았으므로 더 이상 설명 할 수 없습니다. 해야 할 것.

-1

가장 중요한 부분은 메시지가 기존 소켓으로 보내 져야한다는 것입니다. 즉, socket_connect, fsockopen 또는 PHP에서 클라이언트에 대한 임의의 연결을 시도 할 수 없습니다. 이것은 웹 소켓 작업이 아닙니다. 이것이 네트워크 프로그래밍의 기본 개념입니다. phpwebsocket에

그것은 뭔가 같은 것 :

'$의 phpwebsocket'는 PHP의 웹 소켓 객체가
$msg = "hello world"; 
$phpwebsocket->send($user->socket, $msg); 

은 $ 사용자 -이> 소켓이 자바 스크립트 웹 소켓으로 사용 수도회 연결 연결된 사용자입니다() send()는 메시지를 프레임으로 적절하게 인코딩하는 WebSocket 객체 내의 메소드입니다 (또는 곧 필요하게 될 것임).

그러나 어떤 이유로 PHP의 웹 소켓을 사용하여 websocket 서버에 연결하려는 경우 https://github.com/nicokaiser/php-websocket을 확인해야합니다.링크에있는 서버는 현재 솔루션에 만족하면 중요하지 않지만 패키지에는 PHP Websocket 클라이언트 클래스가 필요합니다.

-1

체크 아웃 ratchet popen/proc_open과 함께 telnet과 같은 것을 사용하여 소켓 서버와 통신 할 수 있습니다.

+1

downvote 이유 : http://stackoverflow.com/help/how-to-answer - 구체적으로 "질문에 답변"및 "링크에 대한 컨텍스트 제공" – Ghedipunk

관련 문제