>  기사  >  백엔드 개발  >  PHP의 소켓 사용 예에 ​​대한 자세한 설명

PHP의 소켓 사용 예에 ​​대한 자세한 설명

怪我咯
怪我咯원래의
2017-07-13 09:20:483780검색

소켓(Socket)의 원래 의미는 영어로 "구멍" 또는 "소켓"입니다. BSD UNIX의 프로세스 통신 메커니즘으로는 후자의 의미를 갖는다. 일반적으로 "소켓"이라고도 하며 IP 주소와 포트를 설명하는 데 사용되며 통신 체인에 대한 핸들이며 서로 다른 가상 머신 또는 서로 다른 컴퓨터 간의 통신을 구현하는 데 사용할 수 있습니다. 인터넷상의 호스트는 일반적으로 여러 서비스 소프트웨어를 실행하고 동시에 여러 서비스를 제공합니다. 각 서비스는 소켓을 열고 포트에 바인딩됩니다. 다른 포트는 다른 서비스에 해당합니다. 소켓은 다중 구멍 소켓과 같이 영어의 원래 의미와 같습니다. 호스트는 다양한 소켓이 있는 방과 같습니다. 각 소켓에는 번호가 있습니다. 일부 소켓은 220V AC 전원을 제공하고 일부는 110V AC 전원을 제공하며 일부는 케이블 TV 프로그램을 제공합니다. 클라이언트 소프트웨어는 플러그를 다른 번호의 소켓에 연결하여 다른 서비스를 받습니다. 이 글은 주로 PHP에서의 소켓 사용법을 소개하고, PHP에서의 소켓 통신의 전체 단계를 자세히 설명합니다. 필요한 친구는 이를 참고할 수 있습니다.

1. 소켓을 엽니다

phpinfo(); 소켓 확장이 활성화되어 있는지 확인하고, 그렇지 않으면 php.ini에서 활성화합니다.

2. 서버측 코드 작성 방법

코드는 다음과 같습니다.

<?php
error_reporting(E_ALL);
set_time_limit(0);
//ob_implicit_flush();
$address = &#39;127.0.0.1&#39;;
$port = 10005;
//创建端口
if( ($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
 echo "socket_create() failed :reason:" . socket_strerror(socket_last_error()) . "\n";
}
//绑定
if (socket_bind($sock, $address, $port) === false) {
 echo "socket_bind() failed :reason:" . socket_strerror(socket_last_error($sock)) . "\n";
}
//监听
if (socket_listen($sock, 5) === false) {
 echo "socket_bind() failed :reason:" . socket_strerror(socket_last_error($sock)) . "\n";
}
do {
 //得到一个链接
 if (($msgsock = socket_accept($sock)) === false) {
  echo "socket_accepty() failed :reason:".socket_strerror(socket_last_error($sock)) . "\n";
  break;
 }
 //welcome  发送到客户端
 $msg = "<font color=&#39;red&#39;>server send:welcome</font><br/>";
 socket_write($msgsock, $msg, strlen($msg));
 echo &#39;read client message\n&#39;;
 $buf = socket_read($msgsock, 8192);
 $talkback = "received message:$buf\n";
 echo $talkback;
 if (false === socket_write($msgsock, $talkback, strlen($talkback))) {
  echo "socket_write() failed reason:" . socket_strerror(socket_last_error($sock)) ."\n";
 } else {
  echo &#39;send success&#39;;
 }
 socket_close($msgsock);
} while(true);
//关闭socket
socket_close($sock);
?>

서버측은 cli 모드에서 실행해야 합니다. php.ini 파일이 다르게 로드될 수 있습니다. cli mode

다음과 같이 출력할 수 있습니다.

이때, zhoxh 디렉터리에 tem.text 파일이 있습니다. 구성 파일(php.ini) 경로를 확인하세요. => C:WINDOWS . 내 php.ini 파일이 아닙니다. 이는 호출되는 php.ini 파일이 잘못되었음을 의미합니다. 이때 php.ini 파일 명령을 다음과 같이 지정해야 합니다

환경 변수를 설정한 상태에서 내 php를 바로 실행할 수 있다는 점 참고하세요.

3.클라이언트

코드는 다음과 같습니다.

<?php
//error_reporting(E_ALL);
echo "<h2>tcp/ip connection </h2>\n";
$service_port = 10005;
$address = &#39;127.0.0.1&#39;;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
 echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
 echo "OK. \n";
}
echo "Attempting to connect to &#39;$address&#39; on port &#39;$service_port&#39;...";
$result = socket_connect($socket, $address, $service_port);
if($result === false) {
 echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
 echo "OK \n";
}
$in = "HEAD / http/1.1\r\n";
$in .= "HOST: localhost \r\n";
$in .= "Connection: close\r\n\r\n";
$out = "";
echo "sending http head request ...";
socket_write($socket, $in, strlen($in));
echo  "OK\n";
echo "Reading response:\n\n";
while ($out = socket_read($socket, 8192)) {
 echo $out;
}
echo "closeing socket..";
socket_close($socket);
echo "ok .\n\n";

실행 결과는 다음과 같습니다.

server:

client:

위 내용은 PHP의 소켓 사용 예에 ​​대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.