1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > PHP中Socket服务器搭建和测试方法教程

PHP中Socket服务器搭建和测试方法教程

时间:2021-10-30 02:09:01

相关推荐

PHP中Socket服务器搭建和测试方法教程

后端开发|php教程

Socket,php,服务器

后端开发-php教程

本文主要和大家分享PHP中Socket服务器搭建和测试方法教学,希望能帮助到大家。

网站鞭炮源码,vscode 必备扩展,ubuntu不行,tomcat内部通讯,sqlite 如何取时间,jquery电子杂志插件,前端框架技术软件技术,经过网络爬虫处理的数据,php 静态类 方法调用,seo软件平台运营,ctscms旅游网站管理系统,html5时间网页代码,dedecms家具公司模板lzw

1.socket服务器搭建思路

ckeditor 源码模式,ubuntu安装swap格式,青县有爬虫馆,php he,来宾seo外包lzw

1) 目的:理解socket服务器工作机制

视频直播系统asp源码,修改ubuntu显示大小,tomcat安装不成功原因,爬虫获取中国天气,温州PHP开发工程师招聘,温州seo收费lzw

2) 思路:创建socket -> 把socket加入连接池 -> 处理接收信息 -> 握手动作 -> 发送信息

2.socket服务器代码

注:复制到php文件,直接命令行可以运行,不需要其他支持

特别注意:为了能传输中文_sendMsg做了json_encode()

master = $this->_connect($address, $port); $this->sockets[] = $this->master; //运行socket while (true) { $sockets = $this->sockets; $write = NULL; $except = NULL; socket_select($sockets, $write, $except, NULL); //$write,$except传引用 foreach ($sockets as $socket) {if ($socket == $this->master) { $client = socket_accept($socket); $this->handshake = false; if ($client) { $this->sockets[] = $client; //加入连接池 }} else { //接收信息 $bytes = @socket_recv($socket, $buffer, 2048, 0); if ($bytes _disConnect($socket); continue; }; //处理信息 if (!$this->handshake) { $this->_handshake($socket, $buffer); } else { $buffer = $this->_decode($buffer); $this->_sendMsg($buffer, $socket); }} } } } /*** 创建socket连接* @param $address* @param $port* @return resource*/ private function _connect($address, $port) { //创建socket $master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"); socket_bind($master, $address, $port) or die("socket_bind() failed: reason: " . socket_strerror(socket_last_error($master)) . "\n"); socket_listen($master, 5) or die("socket_listen() failed: reason: " . socket_strerror(socket_last_error($master)) . "\n"); return $master; } /*** 握手动作* @param $socket* @param $buffer*/ private function _handshake($socket, $buffer) { //握手动作信息 $buf = substr($buffer, strpos($buffer, Sec-WebSocket-Key:) + 18); $key = trim(substr($buf, 0, strpos($buf, "\r\n"))); $new_key = base64_encode(sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)); $new_message = "HTTP/1.1 101 Switching Protocols\r\n"; $new_message .= "Upgrade: websocket\r\n"; $new_message .= "Sec-WebSocket-Version: 13\r\n"; $new_message .= "Connection: Upgrade\r\n"; $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n"; //记录握手动作 socket_write($socket, $new_message, strlen($new_message)); $this->handshake = true; } /*** 断开socket连接* @param $socket*/ private function _disConnect($socket) { $index = array_search($socket, $this->sockets); socket_close($socket); if ($index >= 0) { array_splice($this->sockets, $index, 1); } } /*** 发送信息* @param $buffer* @param $client*/ private function _sendMsg($buffer, $client) { $send_buffer = $this->_frame(json_encode($buffer)); foreach ($this->sockets as $socket) { if ($socket != $this->master && $socket != $client) { //广播发送(除了自己)socket_write($socket, $send_buffer, strlen($send_buffer)); } } } /*** 解析数据帧* @param $buffer* @return null|string*/ private function _decode($buffer) { $len = $masks = $data = $decoded = null; $len = ord($buffer[1]) & 127; if ($len === 126) { $masks = substr($buffer, 4, 4); $data = substr($buffer, 8); } else if ($len === 127) { $masks = substr($buffer, 10, 4); $data = substr($buffer, 14); } else { $masks = substr($buffer, 2, 4); $data = substr($buffer, 6); } for ($index = 0; $index < strlen($data); $index++) { $decoded .= $data[$index] ^ $masks[$index % 4]; } return $decoded; } /*** 处理返回帧* @param $buffer* @return string*/ private function _frame($buffer) { $len = strlen($buffer); if ($len <= 125) { return "\x81" . chr($len) . $buffer; } else if ($len run(127.0.0.1, 2046);

3.客户端代码

注:直接复制到html,和上面的php文件在同一文件夹即可,特别注意onmessage解析的两层 parse

WebSocket Testwebsocket = new WebSocket(ws://127.0.0.1:2046/); websocket.onopen = function(evt) { console.log(connect); websocket.send({"data":"您好,世界!"}); }; websocket.onclose = function(evt) { console.log(onclose); console.log(evt); }; websocket.onmessage = function(evt) { console.log(onmessage); if (evt.data) {console.log(JSON.parse(JSON.parse(evt.data))); } }; websocket.onerror = function(evt) { console.log(onerror); console.log(evt); }; function sendMsg(){ var sendData = { data: document.getElementById( ame).value}; websocket.send(JSON.stringify(sendData)); } WebSocket Test 点击发送

4.测试示例

如何用PHP实现Socket服务器

PHP中向socket服务器收发数据_PHP教学

javascript – 怎么配置WebSocket服务器,用的SegmentFault

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。