프로그래밍/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