socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应于不同的服务。
(*注意代码需运行在cli下,进入到server.php代码目录)
我们通过如下命令查看,套接字是否创建成功。
可以看到服务端接收到了客户端发送的数据
服务端的流程如下:
1、初始化信息并创建套接字(socket_create) 2、绑定IP地址和端口(socket_bind) 3、对端口进行监听(socket_listen) 4、调用accept阻塞,等待有客户端连接(socket_accept) 5、读取请求数据,并处理。(socket_read) 6、发送处理后的数据(socket_write) 7、关闭连接(socket_close)
客户端的流程如下:
1、初始化信息并创建套接字(socket_create) 2、连接服务端(socket_connect) 3、给服务端发送数据(socket_write) 4、获取服务端返回的数据(socket_read) 5、关闭连接(socket_close)
服务端代码server.php如下:
<?php //设置脚本执行时间,0表示没有限制 set_time_limit(0); $ip = '127.0.0.1'; $port = 6666; //创建一个TCP的套接字 if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false ) { //如果创建失败,获取错误信息 $errMsg = socket_strerror(socket_last_error($socket)); die("socket_create: {$errMsg}"); } //绑定套接字 if(socket_bind($socket, $ip, $port) === false) { $errMsg = socket_strerror(socket_last_error($socket)); die("socket_bind: {$errMsg}"); } //监听 if(socket_listen($socket, 5) === false) { $errMsg = socket_strerror(socket_last_error($socket)); die("socket_listen: {$errMsg}"); } //循环处理客户端连接 do { if(($clientSocket = socket_accept($socket)) === false) { $errMsg = socket_strerror(socket_last_error($socket)); die("socket_accept: {$errMsg}"); } else { //给客户端发送信息 $msg = 'connect success'; socket_write($clientSocket, $msg, strlen($msg)); //读取客户端发来的信息 $clientMsg = socket_read($clientSocket, 8192); echo "client msg: {$clientMsg}"; } socket_close($clientSocket); } while (true); socket_close($socket);
客户端代码client.php如下:
<?php //设置脚本执行时间,0表示没有限制 set_time_limit(0); $ip = '127.0.0.1'; $port = 6666; //创建一个TCP的套接字 if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false ) { //如果创建失败,获取错误信息 $errMsg = socket_strerror(socket_last_error($socket)); die("socket_create: {$errMsg}"); } //套接字连接 if(socket_connect($socket, $ip, $port) === false) { $errMsg = socket_strerror(socket_last_error($socket)); die("socket_connect: {$errMsg}"); } //发送信息给服务端 $msg = "client post msg "; if(socket_write($socket, $msg, strlen($msg))) { echo "client post msg success "; } //循环接收服务端发来的信息 while($serverMsg = socket_read($socket, 8192)) { echo "server msg: {$serverMsg} "; } //关闭套接字 socket_close($socket);
> php server.php
> netstat -ano
可以看到6666端口已处在监听状态
然后我们运行client.php程序
> php client.php
客户端也收到了服务端发送的数据