>  기사  >  백엔드 개발  >  PHP는 예제를 사용하여 소켓이 무엇인지 이해합니다.

PHP는 예제를 사용하여 소켓이 무엇인지 이해합니다.

一个新手
一个新手원래의
2017-10-17 09:15:271232검색

1. 소개

아래 그림의 Socket 추상화 레이어 위치를 기준으로 이해해주세요. 소켓은 애플리케이션 계층과 TCP/IP 프로토콜 제품군 간의 통신을 위한 중간 소프트웨어 추상화 계층입니다. 디자인 패턴에서는 인터페이스 뒤에 복잡한 구현을 캡슐화하고 사용자가 호출할 수 있는 간단한 인터페이스 세트만 제공하는 파사드 패턴입니다. 일반적인 프로그래밍 언어에서 이러한 인터페이스는 일반적으로 생성, 바인딩, 수신, 수락, 쓰기, 읽기, 닫기, 연결 등입니다.

2. 예제

1. 렌더링


2. 코드

서버: Server.php


<?php
set_time_limit(0);   // 去掉时间限制
ob_implicit_flush(); // 开启强制刷新

// 1. 创建Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 2. 绑定端口和IP
socket_bind($socket, &#39;127.0.0.1&#39;, 11279);

// 3. 端口监听
socket_listen($socket);
echo &#39;Server is listening!&#39; . PHP_EOL;

// 4. accept阻塞进程
$connect = socket_accept($socket); // 直到有连接进入,accept才会返回
echo &#39;Client [&#39; . $connect . &#39;] is accessing...&#39; . PHP_EOL;

// 5. 交互
socket_write($connect, &#39;Welcome, visitor! Now you can send message to the server.&#39; . PHP_EOL);
while ($connect) {
	// 获取请求
	$request = socket_read($connect, 1024);
	echo &#39;Client [&#39;. $connect .&#39;] message: &#39; . $request;

	// 关闭连接
	if($request == "bye" . PHP_EOL){
		socket_shutdown($connect);
		break;
	}

	// 发送响应
	$response = &#39;Your sended message: &#39; . $request;
	socket_write($connect, $response);
}

// 6. 销毁Socket
socket_close($socket);

클라이언트: client.php


<?php
// 1. 创建Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 2. 建立连接
$result = socket_connect($socket, &#39;127.0.0.1&#39;, 11279);
if($result === false){
	socket_close($socket);
	die(&#39;Socket connect failed: &#39; . socket_strerror(socket_last_error($socket)));
}

// 3. 交互
while($result){    
    // 获取响应
    $response = socket_read($socket, 1024);
    echo $response;

    // 发送请求
    $request = fgets(STDIN);
    socket_write($socket, $request, 1024);

    // 关闭连接
    if($request == "bye" . PHP_EOL){
		socket_shutdown($socket);
    	break;
    }
}

// 4.销毁Socket
socket_close($socket);

위 내용은 PHP는 예제를 사용하여 소켓이 무엇인지 이해합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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