socket은 일반적으로 "소켓"이라고도 알려져 있으며 IP 주소와 포트를 설명하는 데 사용되며 통신 체인. 응용 프로그램은 일반적으로 "소켓"을 통해 네트워크에 요청하거나 네트워크 요청에 응답합니다. 소켓은 프로그램도 아니고 프로토콜도 아닙니다. 운영체제에서 제공하는 통신 계층의 추상적인 API 집합일 뿐입니다. 이전 장에서는 소켓 통신에 사용될 php 소켓의 몇 가지 공통적이고 중요한 기능을 소개했습니다.
통신에는 서버와 클라이언트가 필요합니다.
서버: php를 사용하여 소켓을 초기화한 다음 포트를 바인딩하여 포트를 모니터링합니다. 수락을 호출하여 차단하고 클라이언트가 연결될 때까지 기다립니다.
클라이언트: 클라이언트가 소켓을 초기화한 후 서버에 연결합니다. 연결에 성공하면 클라이언트와 서버 간의 연결이 설정됩니다. 클라이언트는 데이터 요청을 보내고, 서버는 요청을 받아 처리한 후, 응답 데이터를 클라이언트에 보내고, 클라이언트는 데이터를 읽고, 마지막으로 연결을 닫고 상호작용이 종료됩니다.
클라이언트-서버는 서로 상호 작용할 수 있는 애플리케이션입니다. 클라이언트와 서버 간의 상호 작용에는 연결이 필요합니다. 소켓 프로그래밍은 애플리케이션 간의 대화형 연결 설정을 담당합니다.
소켓 연결 과정
연결이 어떻게 시작되는지, 로컬 소켓이 연결되는 대상에 따라 소켓 간 연결 과정은 3단계로 나눌 수 있다 : 서버 모니터링, 클라이언트 요청, 연결 확인.
(1) 서버 모니터링: 서버 측 소켓은 특정 클라이언트 소켓을 찾아내지 않고, 연결을 기다리는 상태로 네트워크 상태를 실시간으로 모니터링한다.
(2) 클라이언트 요청: 클라이언트의 소켓에서 이루어지는 연결 요청을 말하며, 연결 대상은 서버의 소켓이다. 이를 위해 클라이언트의 소켓은 먼저 연결하려는 서버의 소켓을 기술하고 서버측 소켓의 주소와 포트 번호를 지정한 다음 서버측 소켓에 연결 요청을 해야 합니다.
(3) 연결 확인: 서버 측 소켓이 클라이언트 소켓의 연결 요청을 듣거나 받을 때 클라이언트 소켓의 요청에 응답하고 새 스레드를 설정하고 설명을 보내는 것을 의미합니다. 클라이언트가 이 설명을 확인하면 연결이 설정됩니다. 서버측 소켓은 계속 수신 대기 상태에 있으며 다른 클라이언트 소켓으로부터 연결 요청을 계속 수신합니다.
소켓 원리는 아래 흐름도를 참조할 수 있습니다.
다음은 서버-클라이언트 코드 예제를 통한 소켓 통신의 간단한 구현입니다. 전체 프로세스
1. 서버 코드:
<?php set_time_limit(0); //限制执行时间 0为不限制 $ip = '127.0.0.1'; $port = 8001;//端口 /** socket通信整个过程 socket_create //创建一个套接字 socket_bind //给套接字绑定 ip 和端口 socket_listen //监听套接字上的连接 socket_accept //接受一个socket连接 socket_read //接收客户端 发送的数据 socket_write //将数据写到 socket 缓存 向客户端发送 socket_close //关闭套接字资源 */ if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n"; } if(($ret = socket_bind($sock,$ip,$port)) < 0) { echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n"; } if(($ret = socket_listen($sock,4)) < 0) { echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n"; } $count = 0; do { if (($msgsock = socket_accept($sock)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; break; } else { //发到客户端 $msg ="测试成功!\n"; socket_write($msgsock, $msg, strlen($msg)); echo "测试成功了啊\n"; $buf = socket_read($msgsock,8192); $talkback = "收到的信息:$buf\n"; echo $talkback; if(++$count >= 5){ break; }; } //echo $buf; socket_close($msgsock); } while (true); socket_close($sock); ?>
php 파일을 실행합니다. 실행 후 결과가 표시되지 않아야 합니다. netstat -ntlp 포트 8001이 사용 중인지 확인합니다. 아래 그림을 참조하세요.
2. 클라이언트 코드:
<?php error_reporting(E_ALL); set_time_limit(0); echo "socket通信客户端\n"; $port = 8001;//端口 $ip = "127.0.0.1";//ip /** socket连接整个过程 socket_create //建立一个socket 连接 socket_connect // 开始一个socket连接 连接服务端 socket_write //将数据写入缓存 向服务端发送 socket_read// 读取服务端的结果 socket_close // 关闭套接字资源 */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "OK.\n"; } echo "试图连接 '$ip' 端口 '$port'...\n"; $result = socket_connect($socket, $ip, $port); if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; }else { echo "连接OK\n"; } $in = "Ho\r\nfirst blood\r\n"; $out = ''; if(!socket_write($socket, $in, strlen($in))) { echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "发送到服务器信息成功!\n"; echo "发送的内容为:<font color='red'>$in</font> <br>"; } while($out = socket_read($socket, 8192)) { echo "接收服务器回传信息成功!\n"; echo "接受的内容为:",$out; } echo "关闭SOCKET...\n"; socket_close($socket); echo "关闭OK\n"; ?>
서버 창 결과 보기:
참고: PHP 언어의 특성에 따라 PHP는 서버가 아닌 클라이언트에만 적합합니다.
【관련 튜토리얼 추천】
1. "php.cn Dugu Jiujian (4) - PHP 비디오 튜토리얼 "
2. PHP 프로그래밍 입문부터 숙달까지 튜토리얼 세트
위 내용은 간단한 PHP 소켓 통신을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!