프로그래밍/Php

php 로 만드는 socket Server 와 socket Client

소행성왕자 2023. 2. 16. 13:44

socket 연결을 위한 소켓 서버 + 소켓 클라이언트를 php 로 간단히 만들어 보도록 하겠습니다.

1. socket Server  (25003 포트를 사용한다.)

<?php

$host = "0.0.0.0";
$port = 25003;

set_time_limit(0); // no timeout

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");

$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");


do {
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
    do {
        $input = socket_read($spawn, 1024) or die("Could not read input\n");

        $input = trim($input);
        echo "Client Message : " . $input . "\n";

        $response = 'received' . "\n";
        socket_write($spawn, $response, strlen($response)) or die("Could not write output\n");

        if ($input == 'quit') {
            break;
        }
        if ($input == 'shutdown') {
            socket_close($spawn);
            break 2;
        }

    } while (true);
} while (true);
socket_close($socket);

2. soket Client

<?php

$host    = "220.72.212.xxx";
$port    = 25003;

$message = "Hello Server";
echo "Message To server :".$message;

// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

// connect to server
$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");

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

// get server response
$result = socket_read ($socket, 2048) or die("Could not read server response\n");

echo "\nReply From Server  :".$result;

// close socket
socket_close($socket);

 

- 서버 실행

php server2_php.php

- 클라이언트 접속

[localhost socket_server]# php client_php.php
Message To server :Hello Server
Reply From Server  :received

 

서버 접속시 refused 날때

1. 포트 열려있는지 확인

# 열려있지 않다. (25003)
[localhost socket_server]# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      208582/docker-proxy
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1311/master
tcp        0      0 0.0.0.0:9022            0.0.0.0:*               LISTEN      208603/docker-proxy
tcp        0      0 0.0.0.0:9285            0.0.0.0:*               LISTEN      766375/docker-proxy
tcp        0      0 0.0.0.0:9286            0.0.0.0:*               LISTEN      766356/docker-proxy
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      208317/docker-proxy
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      766395/docker-proxy
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      952/sshd


# 위와 같이 열려 있지 않으면 php server2_php.php 실행
# 열려있다 (25003)
[root@localhost socket_server]# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      208582/docker-proxy
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1311/master
tcp        0      0 0.0.0.0:9022            0.0.0.0:*               LISTEN      208603/docker-proxy
tcp        0      0 0.0.0.0:9285            0.0.0.0:*               LISTEN      766375/docker-proxy
tcp        0      0 0.0.0.0:9286            0.0.0.0:*               LISTEN      766356/docker-proxy
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      208317/docker-proxy
tcp        0      0 0.0.0.0:25003           0.0.0.0:*               LISTEN      808197/php
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      766395/docker-proxy
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      952/sshd

2. 외부에서 접속되는지 확인 (telnet 사용)

telnet 1.1.1.1 25003

3. 방화벽 확인

firewall-cmd --list-all

4. 방화벽 포트 오픈

firewall-cmd --permanent --zone=public --add-port=25003/tcp

5. 방화벽 리로드

firewall-cmd --reload