什么是socket? socket是进程间通信共享数据的一种方式。 为什么要用socket? 不同服务器进程间进行数据共享无论是用mysql,redis都是要通过socket进行,所以对于需求量不大的进程间通信,socket是一种简单快捷轻量级的解决方法。 完成一个socket通信要进行哪些
什么是socket?
socket是进程间通信共享数据的一种方式。
为什么要用socket?
不同服务器进程间进行数据共享无论是用mysql,redis都是要通过socket进行,所以对于需求量不大的进程间通信,socket是一种简单快捷轻量级的解决方法。
完成一个socket通信要进行哪些步骤?
不仅仅是php,目前所有的socket通信都是这个步骤。具体到代码层面就是下面这个样子:
server端代码
// 获取协议?? $commonProtocol = getprotobyname("tcp");?? //产生一个socket?? $socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);?? //把socket绑定在一个IP地址和端口上?? socket_bind($socket, 'localhost', 1337);??? //监听由指定socket的所有连接?? socket_listen($socket);?? //初始化buffer?? $buffer = "NO DATA";?? while(true) {?? ???? //接受一个Socket连接?? ???? $connection = socket_accept($socket);?? ???? printf("Socket connected\r\n");?? ???? // 检测 buffer?? ???? if($buffer != ""){?? ????????? printf("Something is in the buffer...sending data...\r\n");?? ????????? //写数据到socket缓存?? ????????? socket_write($connection, $buffer . "\r\n");?? ????????? printf("Wrote to socket\r\n");?? ???? }else {?? ????????? printf("No Data in the buffer\r\n");?? ???? }?? ???? //读取指定长度的数据?? ???? while($data = socket_read($connection, 1024, PHP_NORMAL_READ))?? ???? {?? ????????? $buffer = $data;?? ????????? //写数据到socket缓存?? ????????? socket_write($connection, "Information Received\r\n");?? ????????? printf("Buffer: " . $buffer . "\r\n");?? ???? }?? ???? //关闭一个socket资源?? ???? socket_close($connection);?? ???? printf("Closed the socket\r\n\r\n");?? }
client端代码
// 创建 socket?? $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);?? //链接 socket?? $connection = socket_connect($socket,'localhost', 1337);?? //读取指定长度的数据?? while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) {?? ??? if($buffer == "NO DATA") {?? ??????? printf("NO DATA");?? ??????? break;?? ??? }else{?? ??????? // 输出 buffer?? ??????? printf("Buffer Data: " . $buffer . "");?? ??? }?? }?? printf("Writing to Socket");?? //写数据到socket缓存?? if(!socket_write($socket, "SOME DATA\r\n")){ ??? printf("Write failed");?? }?? //读取指定长度的数据?? while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)){?? ??? printf("Data sent was: SOME DATA Response was:" . $buffer . "");?? }?? printf("Done Reading from Socket");?
延伸阅读
现在有一些比较成熟的php socket扩展,比如swoole?http://wiki.swoole.com/?和workerman?http://www.workerman.net/?使用这些扩展可以让你事半功倍。
想要学好php socket,基本知识还是非常重要的,建议花点时间把官方文档 http://php.net/manual/zh/book.sockets.php 里面的相关函数浏览一遍,练习一下comment里面的代码,避免以后遇到他人遇到过的坑.
原文地址:php socket编程学习笔记, 感谢原作者分享。