一、简介

(本部分参考自 揭开Socket的神秘面纱 - 源码工作室

请结合下图 Socket 抽象层的位置来理解。Socket 是应用层和 TCP/IP 协议族进行通信的中间软件抽象层,是一组接口。在设计模式中,就是一个门面模式,它把复杂的实现封装在接口后面,而只提供了一组简单的接口给用户调用。在普遍的程序语言中,这些接口一般是 create、bind、listen、accept、write、read、close 和 connect 等等。

二、实例

效果图

代码

服务端: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, '127.0.0.1', 11279); // 3. 端口监听
socket_listen($socket);
echo 'Server is listening!' . PHP_EOL; // 4. accept阻塞进程
$connect = socket_accept($socket); // 直到有连接进入,accept才会返回
echo 'Client [' . $connect . '] is accessing...' . PHP_EOL; // 5. 交互
socket_write($connect, 'Welcome, visitor! Now you can send message to the server.' . PHP_EOL);
while ($connect) {
// 获取请求
$request = socket_read($connect, 1024);
echo 'Client ['. $connect .'] message: ' . $request; // 关闭连接
if($request == "bye" . PHP_EOL){
socket_shutdown($connect);
break;
} // 发送响应
$response = 'Your sended message: ' . $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, '127.0.0.1', 11279);
if($result === false){
socket_close($socket);
die('Socket connect failed: ' . 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);

  

参考链接:

揭开Socket编程的面纱

【PHPsocket编程专题(理论篇)】初步理解TCP/IP、Http、Socket.md

php socket通信(tcp/udp)实例分析

最新文章

  1. 从零到有——我的OA如何成长
  2. Oracle中Merge into用法总结
  3. 说说Java的内存
  4. JAVA线程锁-读写锁应用,简单的缓存系统
  5. Httptunnel教程
  6. 【IHttpHandler】在ASP.Net2.0中使用UrlRewritingNet实现链接重写
  7. 解决VirtualBox 上的XP 蓝屏,自动重复启动
  8. BASH小脚本
  9. C# 带用户密码访问网络共享
  10. C#深复制与浅复制
  11. 关于springboot启动时候报错:springboot Failed to parse configuration class [Application]
  12. 如何垂直居中&lt;img&gt;?
  13. expect IDENTIFIER, actual IDENTIFIER 处理
  14. 利用Navicat高效率postgresql转mysql数据库
  15. matplotlib 入门之Pyplot tutorial
  16. 解决:win10在空白处右键资源管理器重启的故障
  17. MySQL Community Server 8.0.11下载与安装配置
  18. win10 任务栏锁定,win键没反应
  19. MySQL 数据库赋予用户权限操作表
  20. Java Nashorn--Part 3

热门文章

  1. Ajax修改全局变量问题解决方法(Zepto版)
  2. AngularJS中$watch
  3. 3.5 面向连接的运输:TCP
  4. 如何用Qt Python创建简单的桌面条形码应用
  5. 51NOD 1559:车和矩形——题解
  6. tyvj1305 最大子序和 【单调队列优化dp】
  7. 洛谷 U14472 数据结构【比赛】 【差分数组 + 前缀和】
  8. MyBatis之自查询,使用 递归实现 N级联动
  9. 解题:POI 2016 Nim z utrudnieniem
  10. 埃及分数&amp;&amp;The Rotation Game&amp;&amp;骑士精神——IDA*