1 배경 소개
목표: 소켓 TCP 전송을 통해 서버를 구축하고 싶습니다. 이 서버의 기능은 여러 클라이언트 끝 연결을 허용하고 상호 의사소통을 완료합니다. 예를 들어, 클라이언트 A와 클라이언트 B는 동시에 서버 S에 연결되어 있습니다. 클라이언트 A는 서버 S에 메시지를 보냅니다. 서버 S는 A의 메시지를 B에 전달합니다. 마찬가지로 B의 메시지도 S를 통해 A에 전달될 수 있습니다. 이런 방식으로 클라이언트 A와 클라이언트 B 간의 상호 커뮤니케이션이 이루어집니다. 이번에는 클라이언트와 서버 간의 연결 및 통신만 구현하며, 당분간 서버의 전달 기능은 없습니다.
TCP의 3방향 핸드셰이크는 서버와 클라이언트 간의 정상적인 통신을 보장할 수 있습니다. 3방향 핸드셰이크 프로세스: 이 프로세스에 대한 설명은 아래 링크를 클릭하여 볼 수 있습니다.
참고: https://www.php.cn/link/70203474234c15a59de1eacc053f5690
서버에는 TCP 통신을 위한 IP와 포트 번호가 있어야 합니다.
고객 서비스 측에는 IP가 있어야 하며, TCP와 통신할 때 포트 번호도 제공해야 합니다.
개인 이해: IP는 집으로 이해될 수 있는 주소입니다. 통신을 설정해야 할 때 먼저 집이 어디에 있는지 알아야 합니다. 그렇지 않으면 정보를 어디로 보내야 할까요?
PORT 포트, 포트 번호는 이 집에 있는 문으로 이해될 수 있습니다. 이 문에서 메시지를 보내거나 받을 수 있는 문을 지정해야 합니다.
클라이언트의 일부 관련 기능:
소켓 만들기socket_create();
서버에서 연결 요청socket_connect( ) ;
서버 메시지 보내기/수락socket_wirte(); /socket_read();
소켓 닫기socket_close();
서버:
소켓 만들기socket_create();
IP 및 포트 번호 바인딩socket_bind();
IP 및 포트 번호 수신(0.0.0.0은 모든 IP를 의미)socket_listen();
클라이언트 연결 대기 차단socket_accept ();
클라이언트 메시지 읽기/클라이언트에게 메시지 쓰기socket_wirte();
Close 소켓socket_close();
서버는 소켓을 생성하고 IP와 PORT를 바인딩한 후 클라이언트가 연결을 시작할 때까지 기다리는 Listen 상태로 들어갑니다.
클라이언트는 소켓을 생성하고 지정된 서버 IP 및 PORT에 연결합니다.
서버는 클라이언트가 시작한 연결을 수락합니다.
양 당사자는 서로 데이터를 보낼 수 있습니다.
양 당사자는 소켓을 닫습니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
소켓 만들기 소켓을 생성하고 IP 및 PORT 에 대한 액세스 허용을 설정하여 특정(또는 전체) IP와 특정 포트를 수신 대기하고 클라이언트를 기다리는 차단에 들어가 connet 시작 지정된 서버 IP/PORT로 클라이언트 A의 연결을 수락합니다 양쪽 모두 연결이 설정되었습니다 메시지 보내기 통신 완료 후 A와 B가 동시에 소켓을 닫습니다 A B 주기적인 전송이나 이상 감지에 대해서는 간략한 통신 과정입니다.
3 연습을 시작하세요
3.1 PHP 설치 및 환경 구성
PHP 설치 . 여기에서는 XAMPP를 직접 설치했고 이 소프트웨어는 PHP를 자체적으로 설치했습니다. PHP 언어를 처음 사용하는 경우 Baidu에서 직접 PHP를 설치하거나 XAMPP를 설치할 수 있습니다.
시스템 환경 구성 . 프로그램을 실행할 때 cmd를 통해 실행하기 때문에 시스템 환경변수를 설정해야 합니다. 구성 프로세스는 링크: PHP 환경 변수 구성 을 참조하세요.
php 명령이 실행되는지 확인하세요 . 1단계와 2단계를 완료한 후 cmd를 실행하고 php -v
명령을 실행하면 작업이 완료되면 PHP 버전 번호가 표시됩니다. php -v
,运行完成之后会显示PHP的版本号。
3.2 客户端程序
3.2.1 写程序
新建一个文件夹socket ,在该文件夹下新建文本文档并改名为client.php NOTE:我的文件夹建在桌面上
打开client.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开client.php
写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
<?php
$PORT = 请输入端口号; //端口号请查看博文:*3.2.2 程序执行*。设置有效端口:
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数1:代表IPV4/参数2:流传输/参数3:TCP/
$result = socket_connect($client, "122.114.122.174", $PORT); //向指定地址/端口发出连接请求,连接结果返回到resule
if($result == false){ //这里我们简单的对连接结果进行响应/为了Debug方便
echo "ERROR CONNECT\n";
die();
} else {
echo "CONNECTED\n";
}
$data = "Hello World\n"; //建立将要发送的消息
socket_write($client, $data); //将消息发送出去
socket_close($client); //关闭socket
?> 程序编写完毕,大家可以直接复制过去,或者直接下载 。NOTE:程序直接运行会报错,我们需要指定一个端口号,请继续看下节,如何运行程序。
3.2.2 程序执行
获取程序 。通过上节,我们已经有一个简单的客服端程序,下载请点击 。
查找有效端口 。因为我们现在没有服务器,所以需要借助别人提供的服务器地址及端口进行调试。操作步骤: 1.点击这里打开网页 2.页面的下方找到:122.114.122.174:xxxxx 3.将xxxxx部分替换到程序中的第二行并保存 网页操作: 程序操作:
打开cmd 。如果没有配置PHP的环境变量请查看:3.1 PHP安装及环境配置
执行命令 cd desktop/socket
。目的是为了到socket文件夹,根据自己文件夹位置填写相关路径。
执行客户端程序 php client.php
3.2 클라이언트 프로그램
새 폴더 socket을 만들고, 폴더 아래에 새 텍스트 문서를 만들고 이름을 바꿉니다. 열기 client.php
for client.php 참고: 내 폴더는 데스크탑에 생성됩니다
참고: 일반적으로 PHP 편집기가 없다면 지금은 메모장으로 client.php를 직접 열 수 있습니다write program 참고: 프로그램은 여기서 직접 드리고 댓글도 드리겠습니다. 2.2 커뮤니케이션 과정을 기준으로 이해하시면 됩니다. 궁금한 점이 있으면 메시지를 남겨주세요
🎜🎜<?php
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数解释同客服端
socket_bind($server, "0.0.0.0", 12345); //绑定端口和IP/0.0.0.0表示允许任意地址发起连接/12345表示允许12345端口号进行连接
socket_listen($server); //进入监听
$connection = socket_accept($server); //接受请求并建立连接
$data = socket_read($connection, 1024); //接受数据
echo $data; //打印数据
socket_close($server);//关闭socket
?> 🎜 프로그램이 작성되어 직접 복사하거나 🎜직접 다운로드🎜할 수 있습니다. 참고: 프로그램을 직접 실행하면 오류가 보고됩니다. 프로그램 실행 방법에 대한 다음 섹션을 계속 진행하세요. . 🎜🎜🎜🎜🎜🎜프로그램 받기🎜. 이전 섹션을 통해 이미 간단한 클라이언트 프로그램이 있습니다. 🎜다운로드하려면 🎜를 클릭하세요. 🎜🎜🎜유효한 포트를 찾으세요🎜. 지금은 서버가 없기 때문에 디버깅을 위해 다른 사람이 제공한 서버 주소와 포트를 사용해야 합니다. 🎜작업 단계: 🎜 1.여기를 클릭하여 웹페이지를 엽니다🎜🎜 2. 하단에서 찾아보세요 페이지: 122.114.122.174 :🎜xxxxx🎜🎜 3. xxxxx 부분을 프로그램의 두 번째 줄로 바꾸고 저장 🎜 웹페이지 작업: 🎜 🎜 🎜🎜🎜cmd를 엽니다🎜. PHP 환경 변수가 구성되지 않은 경우 다음을 확인하세요. 🎜3.1 PHP 설치 및 환경 구성 🎜🎜🎜🎜 🎜cd Desktop/socket
명령을 실행하세요. 목적은 소켓 폴더로 이동하여 자신의 폴더 위치에 따라 해당 경로를 채우는 것입니다. 🎜🎜🎜클라이언트 프로그램🎜php client.php
을 실행하세요. 이때 PHP Fatal 오류가 보고되면 🎜해결 방법을 보려면 클릭하세요🎜🎜🎜🎜 확인하세요. 마지막으로 웹 페이지에 정보가 수신된 것을 확인할 수 있습니다. 🎜 참고: 프로그램 실행 후 CONNECTED가 인쇄되지 않으면 잠시 기다려서 ERROR CONNET이 반환되는지 확인하세요. 이는 🎜포트 번호가 만료되었기 때문입니다(3분 동안만 사용 가능). 웹페이지로 돌아가서 새로 고침하고 프로그램🎜에 수정하세요. 🎜제대로 실행되지 않으면 메시지를 남겨주세요🎜!🎜🎜🎜🎜🎜3.3 로컬 서버 및 클라이언트 프로그램🎜🎜🎜직접 입력하고 싶지 않다면 🎜여기를 클릭하여 다운로드🎜하고 다음으로 이동하세요: 3.3 .3 프로그램 실행. 🎜🎜
3.3.1 写程序/服务器
新建一个文件夹socket (如有,请忽略),在该文件夹下新建文本文档并改名为server.php NOTE:我的文件夹建在桌面上
打开server.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开server.php
写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
<?php
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数解释同客服端
socket_bind($server, "0.0.0.0", 12345); //绑定端口和IP/0.0.0.0表示允许任意地址发起连接/12345表示允许12345端口号进行连接
socket_listen($server); //进入监听
$connection = socket_accept($server); //接受请求并建立连接
$data = socket_read($connection, 1024); //接受数据
echo $data; //打印数据
socket_close($server);//关闭socket
?> 3.3.2 写程序/客户端
打开文件夹socket (server.php所在文件夹),在该文件夹下新建文本文档并改名为client.php (如有,请打开直接修改程序即可) NOTE:我的文件夹建在桌面上
打开client.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开client.php
写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
<?php
$PORT = 12345; //与server端口匹配
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数1:代表IPV4/参数2:流传输/参数3:TCP/
$result = socket_connect($client, "127.0.0.1", $PORT); //向指定地址/端口发出连接请求,连接结果返回到resule/127.0.0.1指本地IP
if($result == false){ //这里我们简单的对连接结果进行响应/为了Debug方便
echo "ERROR CONNECT\n";
die();
} else {
echo "CONNECTED\n";
}
$data = "Hello World\n"; //建立将要发送的消息
socket_write($client, $data); //将消息发送出去
socket_close($client); //关闭socket
?> 3.3.3 程序执行
获取程序 。通过上节,我们已经有一个本地客服端程序和一个服务器程序,下载请点击
打开cmd 。如果没有配置PHP的环境变量请查看:3.1
执行命令 cd desktop/socket
。注意:这个路径需要根据自己实际情况填写,直接下载的应该是cd desktop/simple-socket-php/local-client-server
主要目的是为了找到server.php所在的文件夹 ,根据自己文件夹位置填写相应路径。
执行服务器程序 php server.php
。我们发现cmd卡住了,这个时候在等待客户端连接进来。这个时候如果报错PHP Fatal error,请查看点击查看解决方法 (如果想强制退出进程按下Ctrl+C
)
再打开一个cmd 。
执行命令 cd desktop/socket
。注意:这个路径需要根据自己实际情况填写,直接下载的应该是cd desktop/simple-socket-php/local-client-server
主要目的是为了找到client.php所在的文件夹 ,根据自己文件夹位置填写相应路径。
执行客户端程序 php client.php
。(如果想强制退出进程按下Ctrl+C
) 如果服务器没有反应,请按下Ctrl+C
结束进程,重新按照顺序(先在一个CMD执行server.php,再在另一个CMD执行client.php)执行程序。如有疑问,请留言。
4 结束
到这里,我们已经实现了基本的socket通信,当然,这个程序是完全不能实际应用的,如果想要实际应用,需要增加很多细节方面的东西,有一个做的比较好的Workerman,大家可以自行搜索。 之后我会更新如何把这个server.php在自己的阿里云服务器上面运行,这样,我们就可以随时连接进去实现客服端的相互通信了。如果有兴趣可以关注等待。
推荐学习:《PHP视频教程 》
위 내용은 PHP가 소켓 통신을 구현할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!