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、\0时就停止读取。

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

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-07-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老秦求学

汇编语言学习之汇编语言源程序的输入

  在dos下输入汇编源程序的方法   一 环境的搭建   windows下运行“windows+r”键入“cmd”,就就进入dos系统,输入“debug”进入...

3365
来自专栏SDNLAB

SDN开发笔记(一):SDN开发环境的搭建(win7环境)

前言 鉴于网上对于SDN开发相关的资料较少又乱的现状,从这篇文章开始,我将陆续分享我在SDN开发过程中的经验,我的SDN项目开发是基于OpenDaylight的...

4108
来自专栏大闲人柴毛毛

Linux系统服务——Daemon

什么是Daemon? Daemon是Linux的一些系统服务,它们是一些常驻内存的进程。 Daemon分类 Daemon拥有两种分类方式,按照“daemon是...

3224
来自专栏C/C++基础

DOS常用命令大全

2010-04-17 22:27:19|  分类: 电脑技术 |  标签:dos命令大全 |字号大中小 订阅

1751
来自专栏PHP在线

PHP错误类型及屏蔽方法

程序只要在运行,就免不了会出现错误,错误很常见,比如Error,Notice,Warning等等。这篇文章具体说一下PHP的错误类型和屏蔽方法。在PHP中,主要...

3538
来自专栏Albert陈凯

HTTP、TCP、UDP:通信协议的规则和区别

TCP、HTTP、UDP:都是通信协议,也就是通信时所遵守的规则,只有双方按照这个规则“说话”,对方才能理解或为之服务。 TCP HTTP UDP三者的...

2898
来自专栏difcareer的技术笔记

JNI实现源码分析【五 结束语】正文

一开始打算用一篇文章来写的,结果写着写着,发现内容实在太多了,一篇文章显得很乱,有很多地方不知道先写哪个好,经过一段时间的构思后,决定用一个系列来写,分多个部分...

945
来自专栏smy

webpack打包速度和性能再次优化

一. 改单dll为双dll ? 因为上图原因,使用CommonsChunkPlugin时,导致其打包出来的vendors.js内的模块ID会因为其他文件引用模块...

6378
来自专栏linux驱动个人学习

预处理

预处理有很多,以下选取我实际用过和见过的: #ifdef 电脑程序语句,我们可以用它区隔一些与特定头文件、程序库和其他文件版本有关的代码。 1 #includ...

2703
来自专栏北京马哥教育

用python来更改小伙伴的windows开机密码,不给10块不给开机

1253

扫码关注云+社区