【发布时间】:2021-05-14 14:58:15
【问题描述】:
我正在使用 PHP 开发一个面向对象的应用程序,该应用程序连接到远程服务器以读取和发送数据。为此,我使用fsockopen()、fgets() 读取、fwrite() 写入和fclose()。
我将其简化为必要的代码:
<?php
namespace myApplication;
class client {
protected $socket;
public $connected = false;
public function connect(string $host, int $port) : bool {
if (($this->socket = fsockopen($host, $port, $errno, $errstr, 15)) == false) {
return false; //or error handling
}
$this->connected = true;
return true;
}
public function disconnect() {
if ($this->connected) {
@fclose($this->socket);
$this->connected = false;
}
}
public function read() : ?string {
if ($this->connected === false) {
/*
throw error
*/
}
if (($data = fgets($this->socket)) !== false) {
return $data;
}
else {
/*
error handling
*/
}
}
public function write($write_data) : bool {
if ($this->connected === false) {
/*
throw error
*/
}
$write_data .= "\r\n"; //carriage return, newline
if (fwrite($this->socket, $write_data, strlen($write_data)) != false) {
return true;
}
else {
/*
error handling
*/
return false;
}
}
}
问题
首先,一切似乎都按预期进行。客户端连接到服务器,它成功检索到服务器发送的第一条问候语,并在调用fwrite() 时返回它成功写入所有字节。 (PHP 文档说函数的返回值是写入的字节数。)所以这一切似乎工作得很好。
但是服务器从不从客户端获取数据。我用我为调试目的编写的一个简单的 PHP 套接字服务器测试了客户端,但它也没有从客户端检索任何数据。
我不知道为什么会这样。连接已成功建立,如前所述,客户端可以从服务器检索数据。但是不知什么原因,fwrite() 没有成功发送数据。
没有错误或警告消息。日志级别E_ALL。
版本和信息:
- 操作系统: Debian 10 Buster,最新版本的所有软件包。
-
php --version输出: PHP 7.3.19-1~deb10u1
欲了解更多信息,请在此处提问,我会积极回答问题。
【问题讨论】:
-
不应该
$write_data .= '\r\n';是$write_data .= "\r\n";吗?即用双引号... -
是的,你是对的!我在为这个问题写 sn-p 时犯了错误,我的错。我已经编辑了问题并修复了它。
标签: php sockets fgets fwrite fsockopen