php - 在单独的函数中绑定套接字和 recvfrom
问题描述
我正在尝试从游戏中接收 UDP 数据。并在页面上不断更新。使用 JSON 从函数中检索数据。
是否可以将 socket_create/socket_bind 与 socket_recvfrom 分开?
(我已经删掉了一些不必要的代码)
private $socket;
public function socketConnect($port)
{
$ip = '0.0.0.0'; // local IP
$port = 20777; // port to listen
$this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($this->socket, $ip, $port) or die("Could not connect");
return view('telemetry');
}
public function getData()
{
while (socket_recvfrom($this->socket, $buf, $bytes, 0, $remote_ip, $remote_port)) {
// do something
return response()->json($data);
}
}
我尝试设置 $this->socket 来保留数据,但这似乎不起作用。
解决方案
你不能那样做,不。使用 socket_* 方法创建的套接字不是持久的,因为它们是低级套接字。在这里,您的两个函数在两个彼此独立的不同页面调用中执行(这就是 PHP 的工作方式)。
此外,您现在正在尝试做的是一个套接字服务器(绑定一个套接字通常是为了服务器目的),并且套接字服务器需要不断地打开才能接收数据。我建议你尝试做一个 CLI 程序(仍然可以在 PHP 中完成)并使用socket_recvfrom和socket_sendto方法来获取和发送数据(在完成绑定之后),然后将接收到的数据存储在数据库中或在一个文件中,然后让您的网站从中读取以将其发送到您的浏览器。这是一个说明如何在 PHP 中创建简单的 UDP 服务器的方法。
推荐阅读
- c# - 实体框架核心 2.0.3 未提供来自数据库的最新数据
- ios - 推送通知未在 IOS 中显示
- php - WooCommerce:产品属性税查询问题,未显示任何产品
- python - 更新图例文本而不更新 matplotlib 中图例框的大小
- gruntjs - Grunt 没有显示导致它失败的文件
- c++ - 如何处理分段错误
- .net - 创建 Cloud Monitoring (Stack-Driver) 指标来衡量对外部 api 的请求计数
- reactjs - 表单验证 - 我是在前端还是后端执行此步骤?反应
- java - EventHub 函数的发送方和接收方应用程序的输出
- mongodb - 在 mongodb 的单独字段中查询具有相关属性计数的实体