本篇文章给大家带来的内容是关于php下Socket服务器如何搭建并测试?(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
1、socket服务器搭建思路
1) 目的:理解socket服务器工作机制
2) 思路:创建socket -> 把socket加入连接池 -> 处理接收信息 -> 握手动作 -> 发送信息
2、socket服务器代码
注:复制到php文件,直接命令行可以运行,不需要其他支持
特别注意:为了能传输中文_sendMsg做了json_encode()
<?php /** * Socket服务器 * @author wuchangliang 2018/1/17 */ class SocketServer { private $sockets; //连接池 private $master; private $handshake; /** * @param $address * @param $port */ public function run($address, $port) { //配置错误级别、运行时间、刷新缓冲区 echo iconv('UTF-8', 'GBK', "欢迎来到PHP Socket测试服务。 \n"); error_reporting(0); set_time_limit(0); ob_implicit_flush(); //创建socket $this->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 <= 6) { $this->_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 <= 65535) { return "\x81" . chr(126) . pack("n", $len) . $buffer; } else { return "\x81" . char(127) . pack("xxxxN", $len) . $buffer; } } } $sc = new SocketServer(); $sc->run('127.0.0.1', 2046);
3、客户端代码
注:直接复制到html,和上面的php文件在同一文件夹即可,特别注意onmessage解析的两层 parse
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>WebSocket Test</title> <script language="javascript"type="text/javascript"> websocket = 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('name').value}; websocket.send(JSON.stringify(sendData)); } </script> </head> <body> <h2>WebSocket Test</h2> <input type="text" name="name" id="name" /> <a href="javascript:;" onclick="sendMsg()">点击发送</a> </body> </html>
4、测试示例
相关推荐:
以上是php下Socket服务器如何搭建并测试?(代码)的详细内容。更多信息请关注PHP中文网其他相关文章!

使用数据库存储会话的主要优势包括持久性、可扩展性和安全性。1.持久性:即使服务器重启,会话数据也能保持不变。2.可扩展性:适用于分布式系统,确保会话数据在多服务器间同步。3.安全性:数据库提供加密存储,保护敏感信息。

在PHP中实现自定义会话处理可以通过实现SessionHandlerInterface接口来完成。具体步骤包括:1)创建实现SessionHandlerInterface的类,如CustomSessionHandler;2)重写接口中的方法(如open,close,read,write,destroy,gc)来定义会话数据的生命周期和存储方式;3)在PHP脚本中注册自定义会话处理器并启动会话。这样可以将数据存储在MySQL、Redis等介质中,提升性能、安全性和可扩展性。

SessionID是网络应用程序中用来跟踪用户会话状态的机制。1.它是一个随机生成的字符串,用于在用户与服务器之间的多次交互中保持用户的身份信息。2.服务器生成并通过cookie或URL参数发送给客户端,帮助在用户的多次请求中识别和关联这些请求。3.生成通常使用随机算法保证唯一性和不可预测性。4.在实际开发中,可以使用内存数据库如Redis来存储session数据,提升性能和安全性。

在无状态环境如API中管理会话可以通过使用JWT或cookies来实现。1.JWT适合无状态和可扩展性,但大数据时体积大。2.Cookies更传统且易实现,但需谨慎配置以确保安全性。

要保护应用免受与会话相关的XSS攻击,需采取以下措施:1.设置HttpOnly和Secure标志保护会话cookie。2.对所有用户输入进行输出编码。3.实施内容安全策略(CSP)限制脚本来源。通过这些策略,可以有效防护会话相关的XSS攻击,确保用户数据安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显着提升应用在高并发环境下的效率。

thesession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceIsiseededeedeedeedeedeedeedto to to avoidperformance andununununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函数配置会话名称。具体步骤如下:1.使用session_name()函数设置会话名称,例如session_name("my_session")。2.在设置会话名称后,调用session_start()启动会话。配置会话名称可以避免多应用间的会话数据冲突,并增强安全性,但需注意会话名称的唯一性、安全性、长度和设置时机。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)