PHP socket服务端与客户端的简易通信
今天学习socket通信的同时,顺便整理了下以前初识socket的知识。
现在关于php的socket通信,有些框架已经十分成熟了,比如 swoole 和 workerman,这两个大家可以学习学习。
行了不说废话了,现在切回正题,说下今天的东西吧。
Socket连接过程
分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求
测试如下:
server.php
<?php //获取tcp协议号码。
$tcp = getprotobyname("tcp");
// 建立server端socket ,创建并返回一个套接字,也称作一个通讯节点。一个典型的网络连接由 2 个套接字构成,一个运行在客户端,另一个运行在服务器端。
$socket = socket_create(AF_INET, SOCK_STREAM, $tcp);
//绑定要监听的ip和端口,这里绑定的ip一定要写局域网ip,写成127.0.0.1客户端将无法与服务端建议连接。
socket_bind($socket, '192.168.1.11', 10008);
//监听端口
socket_listen($socket); //初始化一个数据,和客户端通信
$buffer = "connect";
while (true) {
// 接受客户端请求过来的一个socket连接
$connection = socket_accept($socket);
if(!$connection){
echo "connect faild";
}else{
echo "Socket connected\n";
// 向客户端传递一个信息数据
if ($buffer != "") {
echo "send data to client\n";
socket_write($connection, $buffer . "\n");
echo "Wrote to socket\n";
} else {
echo "no data in the buffer\n" ;
}
// 从客户端获取得的数据
while ($data = @socket_read($connection, 1024, PHP_NORMAL_READ)) {
printf("Buffer: " . $data . "\n");
//取得信息给客户端一个反馈, Thank you client, you data is Received success发给客户端的回应信息。
socket_write($connection, "Thank you client, you data is Received success\n");
}
} //关闭 socket
socket_close($connection);
printf("Closed the socket\n");
}
?>
client.php
<?php
// 建立客户端的socet连接
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//连接服务器端socket
$connection = socket_connect($socket, '192.168.1.11', 10008);
//要发送到服务端的信息。
$send_data = "This data will Send to server!";
//客户端去连接服务端并接受服务端返回的数据,如果返回的数据保护not connect就提示不能连接。
while ($buffer = @socket_read($socket, 1024, PHP_NORMAL_READ)) {
if (preg_match("/not connect/",$buffer)) {
echo "don`t connect\n";
break;
} else {
//服务端传来的信息
echo "Buffer Data: " . $buffer . "\n";
echo "Writing to Socket\n";
// 将客户的信息写到通道中,传给服务器端
if (!socket_write($socket, "$send_data\n")) {
echo "Write failed\n";
}
//服务器端收到信息后,客户端接收服务端传给客户端的回应信息。
while ($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) {
echo "sent to server:$send_data\n response from server was:" . $buffer . "\n";
} }
}
?>
测试图片如下:




PHP socket服务端与客户端的简易通信的更多相关文章
- C# Socket服务端与客户端通信(包含大文件的断点传输)
步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤: (1)建立一个Socket (2)接收 ...
- [C语言]一个很实用的服务端和客户端进行TCP通信的实例
本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...
- Python3学习之路~8.3 socket 服务端与客户端
通过8.2的实例1-6,我们可以总结出来,socket的服务端和客户端的一般建立步骤: 服务端 步骤:1创建实例,2绑定,3监听,4阻塞,5发送&接收数据,6关闭. #Author:Zheng ...
- C# Socket服务端和客户端互相send和receive
服务端 { ]; ; { ...
- socket系列之socket服务端与客户端如何通信
上面已经分别介绍了ServerSocket跟Socket的工作步骤,并且从应用层往系统底层剖析其运作原理,我们清楚了他们各自的一块,现在我们将把他们结合起来,看看他们是如何通信的,并详细讨论一下他们之 ...
- Socket服务端和客户端文件传输
很多朋友在使用socket编程时不可避免的都做过文件传输,而视频电影等需要一个字节一个字节的传输:但是客户端一般都通过-1进行终止,服务也一样:但是存在的问题是客户端永远不会把-1传递给服务端:因此经 ...
- golang的socket服务端与客户端
服务端 服务端的处理流程 监听端口 接收客户端的链接 创建goroutine,处理该链接 package main import ( "fmt" "net" ) ...
- [C语言]一个很实用的服务端和客户端进行UDP通信的实例
前段时间发了个TCP通信的例子,现在再来一个UDP通信的例子.这些可以作为样本程序,用到开发中.“裸写”socket老是记不住步骤,经常被鄙视…… 下面的例子很简单,写一个UDP的server用于收包 ...
- C# Socket服务端及多客户端连接通信实现
服务端代码(控制台示例): static List<Socket> Sockets = new List<Socket>(); static void Main(string[ ...
随机推荐
- 百度富文本Ueditor编辑器的使用
往在web开发的时候,尤其是在网站开发后台管理系统的时候经常会使用到富文本编辑器,这里我们来使用百度提供的富文本编辑器UEditor,以提高我们的开发效率 UEditor官网下载地址:https:// ...
- sublime开启vim模式
sublime自带vim模式Vintage,只是默认是ignore状态,因此如果按Esc键没有进入vim模式,只需要按ctrl+shift+P进入命令模式,键入Enable package,输入Vim ...
- 安装zabbix时PHP ldap Warning
一.如果是源码编译 [root@DaMoWang php-]# / opcache.a opcache.so # 出现告警是因为ldap模块不存在,须要编译生成此模块并重新加载 到源码包的解压目录下, ...
- Linux基础命令---lpc打印机控制
lpc lpc指令用来控制打印机,它提供了一个命令行,用户可以输出命令来控制打印机.如果命令行上没有指定命令,lpc将从标准输入中显示提示符并接受命令. 此命令的适用范围:RedHat.RHEL.Ub ...
- 【winform】DataGridView控件[表格]
一.表格 0.从数据库获取一个表在DataGridView中显示: 数据库查询的方式大同小异,重点是如何把数据显示到控件中的方法,通过dataset作为数据的中继,把Adapter中的数据存到data ...
- react脚手架搭建及配置
npm install -g create-react-app 装完之后,生成一个新的项目,可以使用下面的命令: create-react-app my-app cd my-app/yarn star ...
- 利用“Java同包同名类执行顺序”取消Java 网站应用程序Licence验证
如果是在tomcat里运行,lib目录下一大堆的JAR包,不同的JAR包里可能会有相同的包名类名,JRE按照JAR名字的字母顺序加载JAR文件,同名类如果已加载,则后面的同名类会忽略. 公司购买的一款 ...
- Technical poem
Apartment Good apartment be booked the second it bring to market. low product sold to many man, and ...
- TCP之种种连接异常
1. connect出错: (1) 若TCP客户端没有收到syn分节的响应,则返回ETIMEOUT错误:调用connect函数时,内核发送一个syn,若无响应则等待6s后再发送一个,若仍然无响应则等待 ...
- C语言求n的阶乘(n!)
从键盘输入一个数,求出这个数的阶乘,即 n!. 算法思想 首先要清楚阶乘定义,所谓 n 的阶乘,就是从 1 开始乘以比前一个数大 1 的数,一直乘到 n,用公式表示就是:1×2×3×4×…×(n-2) ...