1. socket 概述
socket 也称作套接字,用于描述 IP 地址和端口,是一个通信链的句柄,可以用来实现不同计算机之间的通信。socket 是对 TCP / IP 协议的封装,它只是提供了一组针对 TCP 或者 UDP 进行编程的接口(API)。
socket 利用客户端 / 服务器端的模式巧妙地解决了进程之间建立通信连接的问题。
2. socket 的工作原理
服务器端先初始化 socket,然后与端口绑定(bind),对端口进行监听(listen),等待客户端连接,调用accept阻塞。
这时,如果有客户端初始化一个 socket,然后请求连接服务器(connect),如果连接成功,客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
3. socket通信演示
服务器端的代码:
(在 E:\xampp\htdocs\demo 下新建一个php文件socket_server.php)
<?php
// 设置脚本最大执行时间,单位为秒,0表示永不超时
set_time_limit(0);
$address = '127.0.0.1';
$port = 10005;   // 端口可以是1到65535之间的任何数字,前提是未被占用
// 创建并返回一个套接字(通讯节点),一个典型的网络连接由 2 个套接字构成,一个运行在服务器端,另一个运行在客户端
if( ($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
echo "socket_create() failed, reason: " . socket_strerror(socket_last_error()) . "\n";
}
// 绑定socket到具体的主机端口
if (socket_bind($sock, $address, $port) === false) {
echo "socket_bind() failed, reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
// 监听socket服务器上的请求连接,等待接入
if (socket_listen($sock, 5) === false) {
echo "socket_listen() failed, reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
do {
// 确认客户端的连接请求,成功后,返回一个新的子socket句柄(子线程),用于通信
if (($msgsock = socket_accept($sock)) === false) {
echo "socket_accept() failed, reason: ".socket_strerror(socket_last_error($sock)) . "\n";
break;
}
$msg = "Welcome to connect '$address'"."\n";
// 发送消息(数据)到客户端
if (false === socket_write($msgsock, $msg, strlen($msg))){
echo "socket_write() failed, reason: " . socket_strerror(socket_last_error($sock)) ."\n";
}
echo "Read client message \n";
// 读取客户端的数据
$receivedData = socket_read($msgsock, 8192);
echo "Received message: ".$receivedData."\n";;
// 将客户端发来的数据,进行处理,然后再发送数据给客户端
$responseData = '[time:'.date('Y-m-d H:i:s').']'.PHP_EOL.'[data:'.trim($receivedData).']';
if (false === socket_write($msgsock, $responseData, strlen($responseData))) {  
echo "socket_write() failed, reason: " . socket_strerror(socket_last_error($sock)) ."\n";
}
// 关闭连接成功的子socket
socket_close($msgsock);
} while(true);
// 关闭等待接入的socket
socket_close($sock);
?>
服务器端的代码,需要在 cmd 下或者 CLI模式下运行,打开命令行窗口,输入如下命令:
php E:\xampp\htdocs\demo\socket_server.php
就可以在服务器端运行socket服务。
注意:服务器端的命令行窗口不可关闭。
客户端的代码:
(在 E:\xampp\htdocs\demo 下新建一个php文件socket_client.php)
<?php
$address = '127.0.0.1';
$service_port = 10005;
// 创建并返回一个套接字(通讯节点)
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed, reason: ".socket_strerror(socket_last_error())."\n";
echo "Attempting to connect to '$address' on port '$service_port'...";
// 发起socket连接请求
$result = socket_connect($socket, $address, $service_port);
if($result === false) {
echo "socket_connect() failed, reason: ".socket_strerror(socket_last_error($socket))."\n";
} else {
echo "Connect success. \n";
}
$input = "This is a message from client"."\n";
// 向socket服务器发送消息
socket_write($socket, $input, strlen($input));
echo  "Client send success \n";
echo "Reading response:\n";
// 读取socket服务器发送的消息
while ($out = socket_read($socket, 8192)) {
echo $out;
}
echo PHP_EOL;
socket_close($socket); // 关闭socket连接
?>
客户端的代码,可以在浏览器中运行(如: http://demo.com/socket_client.php),也可以在命令行窗口运行,新打开一个cmd,输入如下命令:
php E:\xampp\htdocs\demo\socket_client.php
就可以看到客户端与服务器端进行通信的结果。
最后,推荐使用 Workerman 来实现 socket 通信。(详情可参考 Workerman官网)
Workerman 是一款 纯 PHP 开发的 开源 高性能的  PHP Socket  服务器框架。被广泛的用于手机app、手游服务端、网络游戏服务器、聊天室服务器、硬件通讯服务器、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。基于workerman,开发者可以更专注于业务逻辑开发,不必再为 PHP Socket 底层开发而烦恼。

PHP中如何使用socket进行通信?相关推荐

  1. QT中使用C++ socket通信,socket通信原理三次握手和四次握手详解、客户端与服务端实例详解

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP? 2.         Soc ...

  2. Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    JAVA 中原生的 socket 通信机制 转载自:https://github.com/jasonGeng88/blog 当前环境 jdk == 1.8 知识点 socket 的连接处理 IO 输入 ...

  3. C#中开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨

    我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念 1.TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基 ...

  4. Java Socket编程----通信是这样炼成的

    转载自 Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socke ...

  5. 基于Android的聊天软件,Socket即时通信,实现用户在线聊天

    基于Android的聊天软件,Socket即时通信,单聊,聊天室,可自行扩展功能,完善细节. [实例功能] 1.运行程序,登录界面, 注册账号功能 2.进入主界面,有通讯录, 个人信息. 3.点击好友 ...

  6. Dubbo底层采用Socket进行通信详解

    由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n  通信理论 计算机与外界的信息交换称为通信.基本的通信方法有并行通信和串行通信两种. 1 ...

  7. 内核中的UDP socket流程(3)(4)——sock_create

    好了,闲话少说.上次看到了sys_socket调用sock_create的地方了.下面开始研究sock_create了. sys_socket将自己的参数family, type, protocol传 ...

  8. Socket的通信原理和使用

     目录 一.什么是 Socket? 二.Socket 通信过程 2.1 通信过程介绍 2.2 实现TCP建立连接的三次握手过程 三. 使用Socket进行通信[php] 3.1 PHP中Socket常 ...

  9. python实现socket简单通信

    python实现socket简单通信 首先先来简单介绍下socket: (具体更详细介绍的可以在网上找找,都讲得非常详细),这里主要是我自己的一些理解. socket是在应用层与传输层之间的一个抽象层 ...

最新文章

  1. Android--Handler使用
  2. CSS盒子模型之CSS3可伸缩框属性(Flexible Box)
  3. linux如何格式化u盘并挂载,Linux下 格式化U盘和挂载
  4. sql between包括两端吗_SQL大全
  5. 漫画:什么是 “元宇宙” ?
  6. php 苹果支付验证,PHP实现Apple应用内购服务端验证
  7. MATLAB 2020b版本发布,下载试用版并上手使用记录。
  8. iOS关于上传iTunes store一直卡住终极解决方案
  9. 操作系统——概念、功能、特征及发展分类
  10. java实现modbus rtu协议与 modscan等工具(2)
  11. Windows常用快捷键和常用的cmd命令(亲测用了办公效率提升明显)
  12. kindle使用参考
  13. 卡尔曼滤波 KF | 扩展卡尔曼滤波 EKF (思路流程和计算公式)
  14. 已经不能再简单的UE4中播放视频没有声音的解决方案
  15. 为设计师写的色彩对比指南,让你真正了解色彩对比
  16. 云知声语音语义识别,语音唤醒和语音合成简单工具类封装
  17. 2015总结与新年计划
  18. Apache RocketMQ 在阿里云大规模商业化实践之路
  19. 存折和银行卡的区别?
  20. 20190826——python对象实例搬家具

热门文章

  1. 手机计算机应用会横屏,北京市大学生计算机应用大赛——3g智能手机创意设计作品提交书模板(游戏类).pdf...
  2. 【网络】如何扫描局域网内所有设备的ip和mac地址
  3. JAVA数据结构--Arraylist
  4. 小程序设置边框border
  5. java中的全限定类名和非限定类名是什么意思?
  6. 用PHP实现虎牙压豆稳赚不赔的方法,RNG和LGD比赛竞猜结算出错被骂骗豆平台,虎牙道歉又送5000Q币...
  7. 数据结构—查找(第八章)
  8. Failed to configure a DataSource
  9. Jmeter接口测试之断言详解
  10. IP地址,子网掩码,默认网关,DNS服务器详解