>php教程 >php手册 >php socket编程学习笔记

php socket编程学习笔记

WBOY
WBOY원래의
2016-06-06 20:13:111593검색

什么是socket? socket是进程间通信共享数据的一种方式。 为什么要用socket? 不同服务器进程间进行数据共享无论是用mysql,redis都是要通过socket进行,所以对于需求量不大的进程间通信,socket是一种简单快捷轻量级的解决方法。 完成一个socket通信要进行哪些

什么是socket?

socket是进程间通信共享数据的一种方式。

为什么要用socket?

不同服务器进程间进行数据共享无论是用mysql,redis都是要通过socket进行,所以对于需求量不大的进程间通信,socket是一种简单快捷轻量级的解决方法。

完成一个socket通信要进行哪些步骤?

d000baa1cd11728b45647b06cafcc3cec3fd2c4c

不仅仅是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里面的代码,避免以后遇到他人遇到过的坑.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.