PHP로 다른서버와 Socket(소켓) 통신하기

안녕하세요. AkibaTV입니다.

이번에 소개할 내용은 PHP를 이용해서 다른서버와 Socket(소켓) 통신하기 입니다.

여기서 다른서버는 소켓으로 들어온 데이터를 처리하는 서버로 PHP로 개발되지 않고 JAVA(자바)로 만들어져 있습니다.

이부분에 대해서는 다음시간에 소개를 해드리도록 하겠습니다.

일단 간단하게 예제형식으로 진행을 해드리는것이기에 자체적으로 APM이 설치되어 있는 서버 또는 웹호스팅을 가지고 계시거나

개인컴퓨터를 PHP가 동작이 되도록 설치를 해두신후 테스트를 해보셔도 되겠습니다만.

이번에 소개는 PHP로 송신하는 기능만 소개를 하기에 수신하는 기능이 없습니다.

그래서 이번에는 송신하는것에 대해서만 소개를 해드리도록 하겠습니다.

일단 간략하게 왜 PHP로만 송신하냐 수신은 왜 안하는지 궁금해 하시는 분들도 계시지만

일단 PHP로는 멀티 스레드 기능을 구현을 하실수가 없습니다.

그렇기때문에 송신은 가능해도 다량의 접속자에 대한 수신처리를 PHP로는 힘들기에 송신 기능만 구현하고

수신기능에 대해선 멀티 스레드가 지원되는 자바 또는 파이선을 이용해서 진행을 하도록 하겠습니다.

서론이 길어졌습니다만 이제부터 샘플소스와 함께 설명을 제공해 드리겠습니다.

서로다른 서버끼리 소켓통신을 공부중이신 분들에게는 유용하게 사용하실수 있겠습니다.

우선은 Visual Studio Code(비주얼 스튜디오 코드)를 실행을 해주시기 바랍니다.

image

파일을 추가를 해주시기 바랍니다.

파일명은 socket_send.php 이며 확장자는 php를 꼭 붙여주시기 바랍니다.

image

아래의 소스코드를 작성 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
error_reporting(E_ALL);

$address = "0.0.0.0"; // 접속할 IP
$port = 7778; // 접속할 PORT
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // TCP 통신용 소켓 생성

if ($socket === false) {
echo "socket_create() 실패! 이유: " . socket_strerror(socket_last_error()) . "\n";
echo "<br>";
} else {
echo "socket 성공적으로 생성.\n";
echo "<br>";
}

echo "다음 IP '$address' 와 Port '$port' 으로 접속중...";
echo "<br>";

// 소켓 연결 및 $result에 접속값 지정
$result = socket_connect($socket, $address, $port);

if ($result === false) {
echo "socket_connect() 실패.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
echo "<br>";
} else {
echo "다음 주소로 연결 성공 : $address.\n";
echo "<br>";
}

$sendData = array("message" => "Hello");
$json = json_encode($sendData);
echo "서버로 보내는 전문 : $json\n";

// 실제로 소켓으로 보내는 명령어
socket_write($socket, $i, strlen($i));

// 소켓으로 부터 받은 REQUEST 정보를 $input에 지정
$input = socket_read($socket, 1024) or die("Could not read from Socket\n");

//REQUEST 정보 출력
echo $input;

// 소켓 클로즈
socket_close($socket);
?>

이렇게해서 PHP에서 자바서버로 메세지를 송신하는 소스코드가 완성 되었습니다.

저는 메세지를 JSON형태로 변환하여 서버로 전송을 하게끔 해두었습니다.

이부분에 대해선 자신이 원하는 방법으로 바꾸셔서 사용하셔도 되겠습니다.

저는 자바서버에서 JSON를 받아서 파싱후 처리를 하게끔 되게 만들어 두었기에 JSON으로 전송을 하겠습니다.

소스코드를 웹서버에 올려주시고 URL로 접속을 하시게 되면 수신서버가 활성화가 되어 있는 상태이면 문제없이 접속이 되며

메세지를 보낸후 수신서버에서 받은 메세지에 대해서 다시 리퀘스트 정보를 보내오게 됩니다.

우선은 수신서버의 아이피주소를 0.0.0.0으로 설정후 접속이 안되는 부분을 먼저 보여드리도록 하겠습니다.

image

알수없는 아이피를 설정후 실행을 하시면 아래와 같이

소켓서버에 연결이 실패했다고 나오면서 에러가 나는것을 확인하실수 있습니다.

image

이번에는 정상적인 서버 아이피로 변경후 Hello, AkibaTV!라고 나오시면 정상적으로 되신것 입니다.