PHP网络技术(四)——Socket简介
PHP网络技术(四)——Socket简介
(原创内容,转载请注明来源,谢谢)
Socket又称为套接字,是操作系统提供的通信层的API,通过套接字,应用程序可以向网络发送请求以及应答请求。
一、进程通信
计算机的每一项工作都在一个进程中,每个进程都有自己的地址范围,因此需要保证进程互不干扰又可以相互协作。Socket提供进程通信的解决方法,实现不同主机进程间的相互通信问题。
同一个主机上,每个进程都有一个独立的编号,称为唯一进程号(Process ID)。但是,不同主机之间,Process ID有可能重复,因此需要解决进程号重复的问题。另外,网络上有各种的通信协议,因此还需要解决不同通信协议造成的识别问题。
TCP/IP协议为了解决上述问题,引入了网址和端口号。通过网址+端口号,可以具体定位到一台主机的一个进程。
Socket在网络架构中的位置图。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
二、Socket编程
Socket编程分为服务端和客户端。服务端提供接口和服务,并且开启后就不断的监听客户端的请求,处理后返回客户端。客户端需要主动和服务端建立连接,并且在连接建立以后对服务端开放的接口发送请求。
服务端可以理解为是一个提供各种服务的资源池,但是不会主动提供服务,当实现socket服务端的代码被执行,则开始持续监听端口,处于待命的状态。客户端是可以调用服务端提供接口的程序,通过建立连接后,可以执行服务端提供的各种服务。
三、PHP的Socket
PHP的Socket需要在PHP Cli模式下进行,即需要在命令行中执行。
PHP有自带的函数处理socket,主要有如下几个。
1、socket_create($domain,$type, $protocol)
该函数用于创建Socket资源(PHP的resource类型变量),其中的参数domain、type和protocol都要求输入int类型,都有定义好的常量可以调用。
domain设置通信协议,如IPV4、IPV6等,IPV4用常量AF_INET,IPV6用AF_INET6。
type设置socket通信交互类型,包括全双工(支持TCP)、半双工(支持UDP)等。全双工类型常量是SOCK_STREAM,半双工类型常量为SOCK_DGRAM。
protocol设置处理类型,包括ICMP、TCP、UDP等,TCP对应的常量是SOL_TCP,UDP是SOL_UDP。
2、socket_bind($socket,$address, $port)
该函数用于将创建的socket资源与特定的IP和端口号绑定。输入的参数,第一个即由socket_create函数创建的socket resource,第二个和第三个分别是IP和端口号。
3、socket_listen($socket,$backlog=0)
该函数用于服务端监听客户端发送的数据,第一个参数是由socket_create函数创建的socket resource,第二个参数是最大连接数,默认是0。
4、socket_set_block($socket)
该函数将socket设置成非阻塞模式。所谓非阻塞,即当多个客户端同时发送请求时,如果其中一个请求耗时很久还没有返回,则此时可以先处理第二个请求,把第一个请求挂着等有结果再返回。当多个用户连接时此配置很重要。
5、socket_write($socket,$buffer)
将$buffer的内容写入到socket中,其中buffer要求是字符串。如果需要传其他内容,如数组,可以使用serialize或json等方式将数据转成字符串后传输。在另一端可以采用相应的方式进行解析。
6、socket_read($socket,$length, $type= PHP_BINARY_READ)
读取socket的信息,length为设置的长度,表示读取length长度的信息。type默认是PHP_BINARY_READ,表示安全读取二进制数据。如果设置成PHP_NORMAL_READ,则遇到r、n、 时就停止读取。
7、pfsockopen($hostname,$port)
此为客户端用的函数。与hostname的服务端建立长链接,不断开。
四、PHP执行socket的方式
PHP执行socket即将上述的几个常用的函数用上。
1、PHP建立服务端文件的代码段。
$sock= socket_create(AF_INET,SOCK_STREAM,SOL_TCP);//ipv4,TCP连接
socket_bind($sock,’127.0.0.1’,1605);//设置连接的ip和端口
socket_listen($sock,10);//设置最大连接数10
$msgsock= socket_accept($sock);
$buf= socket_read($msgsock,8192);//最长字符串长度8192
socket_close($sock);
以上几个基本完成服务端的简单配置,在cli模式下输入php phpfile/to/server.php (即写服务端文件的路径)。通常把accept和read两个放在一个while(true)里面,这样就可以持续的监听。也可以设置一些触发方式让服务端停止监听。
2、PHP建立客户端的代码段
$socket= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket,’127.0.0.1’,1605);//输入服务端的ip和端口
socket_write($socket,‘call to server’, strlen($in));//往服务端发送内容
$out= socket_read($socket, 8192);
socket_close($socket);
以上几个基本完成服务端的简单配置,同样在cli模式下执行即可。
——written by linhxx 2017.07.23
- 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github
- 微信公众平台快速开发框架 For Core 2.0 beta –JCSoft.WX.Core 5.2.0 beta发布
- Android系统层Watchdog机制源码分析
- 算法之插入排序
- Android Studio环境下搭建ReactNative
- Android实现两个ScrollView互相联动,同步滚动的效果
- 一个可以拖动的自定义Gridview代码
- android图片加载库Glide
- 密码最短长度为7,其中必须包含以下非字母数字字符1 完美解决方案
- android开发性能分析
- url带中文参数显示乱码的问题
- 转换程序的一些问题:设置为 OFF 时,不能为表 'Test' 中的标识列插入显式值。8cad0260
- JQuery 对控件的事件操作
- 流畅地HtmlHelper-Asp.Net MVC
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 使用位运算、值交换等方式反转java字符串-共四种方法
- 精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换
- 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用
- 在图中添加多边形
- 设置坐标轴刻度的位置和样式
- OkHttp透明压缩,收获性能10倍,外加故障一枚
- 体验spring-boot-devtools热部署,流畅且不失强大
- 【每周一库】 simsearch - a simple and lightweight fuzzy search engine
- 手把手教你实现xxl-job分布式任务调度平台搭建
- 直播短视频源码,动态需要用到点击图片展示预览效果的功能
- Docker 详细部署不香吗?
- 【41期】盘点那些必问的数据结构算法题之链表
- 那个男人 他带着Vue3来了~
- 小书MybatisPlus第9篇-常用字段默认值自动填充
- 【42期】盘点那些必问的数据结构算法题之二叉堆