phpsocket实现文件传输(phpwebsocket发送消息)

phpsocket实现文件传输(phpwebsocket发送消息)

扫码添加渲大师小管家,免费领取渲染插件、素材、模型、教程合集大礼包!

Socket编程通常是编程中的难点,因为其中涉及了很多底层东西,比如,网络协议、数据传输等。虽然,目前PHP里已经出现了很多socket编程框架,如Workerman、Swoole等,在一定程度上降低了socket编码难度,但若想真正搞懂socket编程,还是有必要亲自理清其运行流程。

下面根据本人日前的学习理解,现将PHP之Socket编程创建流程呈现如下。

phpsocket实现文件传输(phpwebsocket发送消息)

Socket编程,其实就是建立一个网络服务的客户端和服务端,这和我们经常使用的MySQL客户端和服务端是一样的。如上图所示。首先,服务器建立socket套接字,绑定IP、端口,同时保持监听状态。然后,客户端创建Socket套接字,与服务器建立连接。

在介绍具体的操作之前,我们先熟悉几个与Socket编程相关的函数。

1、socket_create(int$domain,int$type,int$protocol)

作用:创建一个socket套接字,说白了,就是一个网络数据流。

返回值:一个套接字,或者是false,参数错误发出E_WARNING警告

php的在线手册那里说得更清楚:socket_create创建并返回一个套接字,也称作一个通讯节点。一个典型的网络连接由2个套接字构成,一个运行在客户端,另一个运行在服务器端。

$domain表示网络协议,网络协议有哪些?它的选择项就下面这三个:

AF_INET:IPv4网络协议。TCP和UDP都可使用此协议。一般都用这个,你懂的。

AF_INET6:IPv6网络协议。TCP和UDP都可使用此协议。

AF_UNIX:本地通讯协议。具有高性能和低成本的IPC(进程间通讯)。

$type表示套接字流,选项有:

SOCK_STREAM

SOCK_DGRAM

SOCK_SEQPACKET

SOCK_RAWSOCK_RDM

这里只对前两个进行解释:

SOCK_STREAMTCP协议套接字。

SOCK_DGRAMUDP协议套接字。

欲了解更多请链接这里:

http://php.net/manual/zh/function.socket-create.php

$protocol表示protocol协议,选项有:

SOL_TCP:TCP协议。

SOL_UDP:UDP协议。

从这里可以看出,其实socket_create函数的第二个参数和第三个参数是相关联的。比如,假如你第一个参数应用IPv4协议:AF_INET,然后,第二个参数应用的是TCP套接字:SOCK_STREAM,那么第三个参数必须要用SOL_TCP,这个应该不难理解。TCP协议套接字嘛,当然只能用TCP协议了,是不是?如果你应用UDP套接字,那么第三个参数该怎么选择我就不说了,呵呵,你懂的。

2、socket_bind(resource$socket,string$address[,int$port=0])

作用:绑定一个套接字,返回值为true或者false

$socket:socket_create的函数返回值

$address:ip地址

$port:端口号

3、socket_listen(resource$socket[,int$backlog=0])

作用:监听一个套接字,返回值为true或者false

$socket:socket_create的函数返回值

$backlog:最大监听套接字个数

4、socket_set_block(resource$socket)

作用:将socket_create创建的套接字设置为阻塞型。当一个操作(例如接收,发送,连接,接受,...)在阻塞套接字上执行时,脚本会暂停执行直到它接收到一个信号或者它可以执行操作。

$socket:socket_create的函数返回值

5、socket_set_nonblock(resource$socket)

作用:将socket_create创建的套接字设置为非阻塞型。

$socket:socket_create的函数返回值

6、socket_accept(resource$socket)

作用:接收套接字的资源信息,成功返回套接字的信息资源,失败为false

$socket:socket_create的函数返回值

7、socket_read(resource$socket,int$length[,int$type=PHP_BINARY_READ])

作用:读取套接字的资源信息,

返回值:成功把套接字的资源转化为字符串信息,失败为false

$socket:socket_create或者socket_accept的函数返回值

$length:读取的字符串的长度

8、socket_write(resource$socket,string$buffer[,int$length=0])

作用:把数据写入套接字中

返回值:成功返回字符串的字节长度,失败为false

$socket:socket_create或者socket_accept的函数返回值

$buffer:字符串

$length:字符串的长度

9、socket_connect(resource$socket,string$address[,int$port=0])

作用:连接一个套接字,返回值为true或者false

$socket:socket_create的函数返回值

$address:ip地址

$port:端口号

10、socket_close(resource$socket)

作用:关闭套接字

返回值:成功返回true,失败为false

$socket:socket_create或者socket_accept的函数返回值

下面来看看具体的实现。

服务端:server.php

phpsocket实现文件传输(phpwebsocket发送消息)

客户端:client.php

phpsocket实现文件传输(phpwebsocket发送消息)

以上代码只要在命令行执行,即可实现socket通讯。不过,这里要注意的是,以上代码执行后,服务器端是阻塞的,即一个服务器,只允许一个客户端连接。

那如何实现一个服务器同时连接多个客户端呢?

要想实现一个服务器同时连接多个客户端,有如下几种方法:

采用阻塞模式,然后每当有一个客户端连上服务端,服务端就fork一个子进程,让子进程来执行读写操作。

采用非阻塞模式,然后每当有一个客户端连上服务端,就将此客户端连接放进一个数组中,最后,通过遍历数组中的连接来与每个客户端进行交互。

采用非阻塞模式,然后,利用epoll机制,来实现服务端与每个客户端的交互。

分享到 :
相关推荐

网站域名被劫持怎么办(网站域名被劫持怎么办啊)

网站域名被劫持的解决方法:1。打开域名管理控制台。将域名的泛解析进行关闭;2。接着将...

如何更改VirMach账户绑定的电子邮箱

VirMach怎么样?VirMach是一家成立于2014年的美国主机商。目前已在美国...

header是什么接口(华硕rgb header)

大家好,今天来介绍header是什么接口(header在电脑主板图中是什么意思啊)的...

怎么挑选美国云主机(怎么挑选美国云主机型号)

挑选美国云主机的方法:1。看美国云主机的网络线路。选择有CN2或GIA线路的美国云主...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注