php 로 소켓 프로그램 만들기 (다중 처리, 멀티스레드)
- 본 예제는 client 의 연결을 자식 프로세스(thread) 로 구동시켜 여러 client 의 요청을 다중 처리하도록 하는 코드 입니다.
- 본 예제는 client 와 서버가 메세지를 한 번씩 주고 받는 예제 입니다.
1. 서버에서 데몬 생성
# vi server.php
#!/usr/local/php/bin/php -q <?php set_time_limit(0); define("_IP", "0.0.0.0"); // 접속 허용할 IP. 모든 IP 에 대하여 오픈할 경우 0.0.0.0 으로 설정 define("_PORT", "81"); $sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($sSock, _IP, _PORT); socket_listen($sSock); pcntl_signal(SIGCHLD, SIG_IGN); while($sock = socket_accept($sSock)) { socket_getpeername($sock, $sockIp, $sockPort); msg("\nclient connect : ".$sockIp.":".$sockPort."\n"); $pid = pcntl_fork(); if($pid == -1) { msg("fork failed\n"); exit; } // 자식 프로세스 일때 if($pid == 0) { $buf = socket_read($sock, 4096); // 클라이언트에서 받은 데이타 처리하는 부분 msg("recive data : ".$buf."\n"); // 클라이언트에게 받은 메세지 msg("client(".$sockPort.") time data request\n"); $re = "Complete launching server"; // 클라이언트에게 응답할 메세지 socket_write($sock, $re); msg("client disconnect : ".$sockIp.":".$sockPort."\n"); socket_close($sock); exit; } } function msg($msg) { echo "SERVER >> ".$msg; } ?> |
실행 권한 부여 및 작성후 데몬 구동
# chmod 700 server.php
# ./server.php &
2. 클라이언트에서 접속 파일 생성
# vi client.php
#!/usr/local/php/bin/php -q <?php define("_IP", "192.168.10.2"); // 접속할 서버 IP define("_PORT", "81"); // 접속할 서버 PORT $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($sock, _IP, _PORT); msg("socket connect to "._IP.":"._PORT."\n"); // 서버로 보낼 데이타 $stdin = "time"; socket_write($sock, $stdin); $sMsg = socket_read($sock, 4096); msg("result : ".$sMsg."\n"); socket_close($sock); exit; // 로그를 출력합니다. 디버그용 function msg($msg) { echo "CLIENT >> ".$msg; } ?> |
3. 테스트
client 에서 생성한 client.php 파일을 실행합니다.
# ./client.php
# ./client_multi.php
CLIENT >> socket connect to 192.168.30.20:444
CLIENT >> result : Complete launching server
* 참고로 (client 접속 당시) 서버 콘솔에 출력된 메세지 입니다.
# SERVER >> client connect : 192.168.30.40:32966
SERVER >> recive data : time
SERVER >> client(32966) time data request
[참조하여 작성함] http://www.phpschool.com/class/php_multi_socket_server3.html
'프로그래밍 > PHP' 카테고리의 다른 글
숫자와 문자 데이타가 섞인 데이터의 정렬 (0) | 2017.09.01 |
---|---|
mysql 레코드를 가져오는 방법중 하나 (0) | 2017.09.01 |
값이 배열 안에 존재하는지 확인하는 in_array함수 (0) | 2016.10.17 |
php 로 소켓 프로그램 만들기 (다중 처리 불가, queue 진행 방식) (0) | 2016.10.14 |
한글 및 공백이 포함된 URL 주소를 UTF-8 로 변환 (urlencode) (0) | 2015.12.10 |