php 로 소켓 프로그램 만들기 (다중 처리 불가, queue 진행 방식)

프로그래밍/PHP|2016. 10. 14. 13:32
반응형

- 본 예제는 client 의 다중 접속 처리가 되지 않는 1 client 를 위한 코드 입니다.

  동시에 두개의 요청이 들어오게 되면 먼저 들어온 요청 처리 후, 대기 되었던 두번째 요청을 처리하게 됩니다.


- 본 예제는 server 에서 보내주는 메세지를 client 에서 확인하는 예제입니다.




1. 서버에서 데몬 생성


# vi server.php


#!/usr/local/php/bin/php -q    // php 실행 파일

<?php

set_time_limit(0);    // 작업을 마칠때까지 세션을 끊지 않음

define("_IP",    "192.168.10.2");    // 서버 IP

define("_PORT",  "443");                // 서버에서 사용할 PORT


$sSock      = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($sSock, _IP, _PORT);

socket_listen($sSock);

while($cSock = socket_accept($sSock))

{

    socket_getpeername($cSock, $addr, $port);

    echo "SERVER >> client connected $addr:$port \n";

    $date = date("Y/m/d H:i:s");

    socket_write($cSock, $date);

    socket_close($cSock);

    echo "SERVER >> client Close.\n";

}

?>


실행 권한 부여 및 작성후 데몬 구동


# chmod 700 server.php

# ./server.php &




2. 클라이언트에서 접속 파일 생성


# vi client.php


#!/usr/bin/php -q    // php 실행 파일

<?php

set_time_limit(0);    // 작업을 마칠때까지 세션을 끊지 않음

define("_IP",    "192.168.10.2");    // 서버 IP

define("_PORT",  "443");               // 서버에서 사용하는 PORT


$sock      = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($sock, _IP, _PORT);

echo "CLIENT >> socket connect to "._IP.":"._PORT."\n";

$date = socket_read($sock, 4096);

echo "CLIENT >> this time is $date \n";

socket_close($sock);

echo "CLIENT >> socket closed.\n";

?>




3. 테스트


client 에서 생성한 client.php 파일을 실행합니다.


# ./client.php

CLIENT >> socket connect to 192.168.10.2:443

CLIENT >> this time is 2016/10/14 13:27:49 

CLIENT >> socket closed.


* 참고로 (client 접속 당시) 서버 콘솔에 출력된 메세지 입니다.


SERVER >> client connected 192.168.10.3:44450 

SERVER >> client Close.




* 내용 추가


client 에서 server 로 메세지를 보내기 위해서는 각각의 파일에 아래 내용을 추가해줍니다.


# vi client.php


$message="Hero";

socket_write($sock, $message, strlen($message)) or die("Could not send data to server\n"); 


# vi server.php


$input = socket_read($cSock, 4096) or die("Could not read input\n");

echo "$input";


반응형

댓글()