当前位置: 首页 > news >正文

golang 网站开发 教程网站建设公司如何规避风险

golang 网站开发 教程,网站建设公司如何规避风险,unity网站后台怎么做,网站管理是做什么的项目需要连接一台自动售货机&#xff0c;售货机要求两边用websocket连接,监听9997端口。本文实现了一个基于PHP的WebSocket服务器&#xff0c;用于连接自动售货机&#xff0c;支持start/stop/restart命令操作 1.新建文件 新建文件 /command/socket.php <?php namespace a…

项目需要连接一台自动售货机,售货机要求两边用websocket连接,监听9997端口。本文实现了一个基于PHP的WebSocket服务器,用于连接自动售货机,支持start/stop/restart命令操作

1.新建文件

新建文件 /command/socket.php

<?php
namespace app\command;use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\Output;class TestSocket extends Command
{public $server;protected static $pidFile = '/tmp/test_socket.pid';protected static $running = true;protected function configure(){$this->setName('test:socket')->setDescription('WebSocket server for JieLe')->addArgument('action', Argument::OPTIONAL, 'start|stop|restart', 'start');}protected function execute(Input $input, Output $output){$action = $input->getArgument('action');switch ($action) {case 'start':$this->startServer($output);break;case 'stop':$this->stopServer($output);break;case 'restart':$this->stopServer($output);sleep(1); // 等待1秒确保服务停止$this->startServer($output);break;default:$output->writeln("Invalid action. Use start|stop|restart");break;}}protected function startServer(Output $output){// 检查是否已运行if (file_exists(self::$pidFile)) {$pid = file_get_contents(self::$pidFile);if (posix_getpgid($pid)) {$output->writeln("Server is already running (PID: {$pid})");return;}}// 创建TCP Socket服务器$this->server = stream_socket_server("tcp://0.0.0.0:9997", $errno, $errstr);if (!$this->server) {$output->error("Failed to start server: $errstr ($errno)");return;}// 保存PIDfile_put_contents(self::$pidFile, getmypid());// 注册信号处理器pcntl_signal(SIGTERM, function() {self::$running = false;});pcntl_signal(SIGINT, function() {self::$running = false;});$output->info("WebSocket server running on ws://0.0.0.0:9997");$clients = [];while (self::$running) {// 处理信号pcntl_signal_dispatch();$read = array_merge([$this->server], $clients);$write = $except = null;// 使用stream_select监听活动连接if (stream_select($read, $write, $except, 5) > 0) {// 处理新连接if (in_array($this->server, $read)) {$client = stream_socket_accept($this->server);$clients[] = $client;}// 处理客户端消息foreach ($read as $socket) {if ($socket === $this->server) continue;$data = fread($socket, 1024);if ($data === false || $data === '') {// 客户端断开$key = array_search($socket, $clients);unset($clients[$key]);fclose($socket);continue;}// WebSocket握手处理if (strpos($data, 'Upgrade: websocket') !== false) {$this->handshake($socket, $data);continue;}// 处理WebSocket帧$decoded = $this->decodeFrame($data);//$decoded = $this->main($decoded); 实际处理业务的函数// 发送回复$response = $decoded;$frame = $this->encodeFrame($response);fwrite($socket, $frame);}}}// 清理工作foreach ($clients as $client) {fclose($client);}fclose($this->server);unlink(self::$pidFile);$output->writeln("Server stopped");}protected function stopServer(Output $output){if (!file_exists(self::$pidFile)) {$output->writeln("Server is not running");return;}$pid = file_get_contents(self::$pidFile);if (posix_getpgid($pid)) {posix_kill($pid, SIGTERM);$output->writeln("Stopping server (PID: {$pid})...");// 等待进程结束$timeout = 10; // 10秒超时while ($timeout-- > 0 && posix_getpgid($pid)) {sleep(1);}if (posix_getpgid($pid)) {posix_kill($pid, SIGKILL); // 强制杀死}}if (file_exists(self::$pidFile)) {unlink(self::$pidFile);}$output->writeln("Server stopped");}/************************************************** websocket转码相关函数  *******************************************************/// WebSocket帧解码public function decodeFrame($data){$len = ord($data[1]) & 127;if ($len === 126) {$masks = substr($data, 4, 4);$data = substr($data, 8);} elseif ($len === 127) {$masks = substr($data, 10, 4);$data = substr($data, 14);} else {$masks = substr($data, 2, 4);$data = substr($data, 6);}$decoded = '';for ($i = 0; $i < strlen($data); $i++) {$decoded .= $data[$i] ^ $masks[$i % 4];}return $decoded;}// WebSocket帧编码public function encodeFrame($data){$frame = [];$frame[0] = 0x81; // FIN + text frame$len = strlen($data);if ($len <= 125) {$frame[1] = $len;} elseif ($len <= 65535) {$frame[1] = 126;$frame[2] = ($len >> 8) & 255;$frame[3] = $len & 255;} else {$frame[1] = 127;for ($i = 0; $i < 8; $i++) {$frame[$i + 2] = ($len >> (8 * (7 - $i))) & 255;}}$frame = array_map('chr', $frame);$frame = implode('', $frame) . $data;return $frame;}// WebSocket握手处理public function handshake($socket, $headers){if (preg_match('/Sec-WebSocket-Key: (.*)\r\n/', $headers, $match)) {$key = base64_encode(sha1($match[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));$response = "HTTP/1.1 101 Switching Protocols\r\n";$response .= "Upgrade: websocket\r\n";$response .= "Connection: Upgrade\r\n";$response .= "Sec-WebSocket-Accept: $key\r\n\r\n";fwrite($socket, $response);}}
}

2.开启服务
docker exec php7.3 php /lnmp/nginx/data/thinkphp6/think test:socket start
docker exec php7.3 php /lnmp/nginx/data/thinkphp6/think test:socket stop
docker exec php7.3 php /lnmp/nginx/data/thinkphp6/think test:socket restart
在这里插入图片描述

3.在nginx配置目录,可通过浏览器访问socket业务

server {listen 80;root 省略;#172.18.0.3是提供php服务的iplocation /rtsp {proxy_pass http://172.18.0.3:9997;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;proxy_read_timeout 600s;}location ~ \.php$ {#省略}}

4.测试

http://www.dtcms.com/a/568990.html

相关文章:

  • 建设电子商务网站论文网站开发核心技术
  • nestjs集成grpc服务
  • Milvus:标量索引详解(十三)
  • 【仓颉纪元】仓颉学习深度实践:30 天从零基础到独立开发
  • RocketMQ【入门实践】
  • Harmony鸿蒙开发0基础入门到精通Day11--TypeScript篇
  • 网站做广告的好处软件定制开发平台
  • 从智能手表拆解看硬件与软件的魔法融合 -嵌入式开发
  • 【java基础语法】---- 综合训练
  • BKA-Transformer-LSTM多变量时间序列预测Matlab实现
  • 如何自己创造一个网站平台搬瓦工装WordPress
  • 数式Oinone亮相GOTC 2025开源集市,企业级产品化引擎冲击Gitee当日热门项目
  • 【产品研究】生物力学软件 SIMM 4.0 for Windows 用户手册总结
  • 更新公司网站内容需要山东住房和城乡建设局网站首页
  • Unity与Android原生交互开发入门篇 - 打开Android的设置
  • 如何查看Linux系统版本?
  • Python类和对象--生命周期方法(对象生命周期,内存管理机制-存储,垃圾回收)
  • PAIMON+STARROCKS 学习
  • *曲速引擎的核心思想
  • AI时代下医药项目管理效能提升与知识管理案例分享︱奥锐特药业研发中心主任庄守群
  • 路由器构建园区网
  • 陕西建设网站如何建立免费网站
  • 设计网站账号品牌策划公司广告语
  • 二十一、kubernetes 1.29 之 运维 03
  • 【论文精读】CMD:迈向高效视频生成的新范式
  • 技术实践 | 延趣游戏用户分层体系:基于TE系统实现精细化运营与流水增长
  • 【硬件SDK项目】uniapp框架设计与业务开发
  • 做推广必须知道的网站淮南网络建站公司
  • tcp 丢包分析
  • 基于改进Gerchberg–Saxton算法的全息图相位恢复方法研究