- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在过去的 5 天里,我一直被困在这个问题上,我不知道如何继续。
概述:
我有一个客户端 UI
,它与一个数据处理程序
库交互,数据处理程序
库使用一个网络管理器
库,这是我的问题所在。
更多信息
首先,QT 为 QTcpServer
( Fortune Server ) 和 QTcpSocket
( Fortune Client ) 之间的交互提供了一个基本示例。
因此,我将这段代码实现为我自己的一个极其基本的示例,它运行起来非常棒,没有任何问题。
快速解释:
服务器应用程序运行,单击启动服务器
,然后在客户端,在字段中输入文本并单击连接到服务器
,然后显示文本,简单!
问题:
在我的 network manager
库中执行上面的代码,不会触发 QTcpSocket::readyRead()
在上面的服务器应用程序中。
它连接到服务器
,其中QTcpServer::newConnection()
正如预期的那样,在 client
写入套接字之后立即被触发,但服务器套接字上的 readyRead()
不会触发,但是在给出的示例中会触发。
注意:在这个server-client
应用示例和我现在的应用中使用了相同的端口
和ip地址
,并且服务器也在运行。
更多信息:
上面的代码,我是直接从客户端复制过来的。只有两件事被改变/修改:
这被复制到我的 network mannager::write()
方法中。运行我的应用程序时,QMainWindow
的实例通过 data handler
类传递,并创建我的 network manager
类的实例,它继承了 QObject
并实现了 Q_OBJECT
宏。
代码示例:
//client_UI
类(片段):
data_mananger *dman = new data_mananger(this); //this -> QMainWindow
ReturnObject r = dman->NET_AuthenticateUser_GetToken(Query);
//data_manager
库(片段)
data_mananger::data_mananger(QObject *_parent) :
parent(_parent)
{}
ReturnObject data_mananger::NET_AuthenticateUser_GetToken(QString Query){
//Query like "AUTH;U=xyz@a;P=1234"
//convert query string to char
QByteArray ba = Query.toLatin1();
//send query and get QList return
ReturnCode rCode = networkManager.write(ba);
//...
}
//netman
库(片段)
//.h
class NETMANSHARED_EXPORT netman : public QObject
{
Q_OBJECT
public
netman();
netman(QObject *_parent);
//...
private:
QTcpSocket *tcp_con;
//...
};
//cpp
netman::netman(QObject *_parent) :
parent(_parent)
{
tcp_con = new QTcpSocket(parent);
}
return;
}
serverIP.setAddress(serverInfo.addresses().first().toIPv4Address());
}
ReturnCode netman::write(QByteArray message, int portNumber){
tcp_con->connectToHost(QHostAddress("127.0.0.1"), 5000);
if (!tcp_con->waitForConnected())
{
qDebug(log_lib_netman_err) << "Unable to connect to server";
return ReturnCode::FailedConnecting;
}
if (!tcp_con->isValid()) {
qDebug(log_lib_netman_err) << "tcp socket invalid";
return ReturnCode::SocketError;
}
if (!tcp_con->isOpen()) {
qDebug(log_lib_netman_err) << "tcp socket not open";
return ReturnCode::SocketError;
}
// QByteArray block(message);
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << QString("Hello world");
if (!tcp_con->write(block)){
qDebug(log_lib_netman_err) << "Unable to send data to server";
return ReturnCode::WriteFailed;
}
else{
qDebug(log_lib_netman_info) << "Data block sent";
return ReturnCode::SentSuccess;
}
}
结论:
客户端的核心代码已经完全实现了,但是我看不出为什么会出现这个错误。
非常感谢帮助/建议!
最佳答案
在写入函数的末尾添加一个 tcp_con->flush()
语句。
您没有在接收器中收到 readyRead
信号,因为写入的数据正在缓冲到套接字中,但实际上并未“通过线路”传输。 flush()
命令导致缓冲区被传输。来自 the docs
This function writes as much as possible from the internal write buffer to the underlying network socket, without blocking. If any data was written, this function returns true; otherwise false is returned.
就我而言,在串行端口和刷新方面有很多经验/挫败感。这相当于“你重启了吗?”在套接字调试工具箱中。
如果其他一切正常,您可能不必flush
,但它是特定于应用程序的,取决于套接字的生命周期、TCP 窗口大小、套接字选项设置以及各种其他因素。也就是说,我总是刷新,因为我喜欢完全控制我的套接字,并且我想确保数据在我想要的时候传输。我不认为这是 hack,但在某些情况下,它可能表明存在其他问题。同样,特定于应用程序。
我很确定在 fortune 服务器示例中不需要刷新,因为它们在 sendFortune()
函数的末尾 disconnectFromHost
,并且来自 Qt documentation :
Attempts to close the socket. If there is pending data waiting to be written, QAbstractSocket will enter ClosingState and wait until all data has been written.
如果套接字也被销毁,它也会断开连接,但从我看到的你的代码来看,你也没有这样做,而且缓冲区还没有满,所以可能实际上没有任何东西刺激缓冲区自行刷新.
其他原因可能是:
while(dataToTransmit)
),但实际上条件永远不会变为 false,这会导致事件循环被阻塞。 QAbstractSocket::LowDelayOption
来禁用它,但它可能会对您的吞吐量产生不利影响……它通常用于对延迟敏感的应用程序。关于c++ - 写入 QTcpSocket 并不总是在相反的 QTcpSocket 上发出 readyRead 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42074728/
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想从输入对象内部开始找到下一个表单元素。Find() 是查找子对象的绝佳函数。但是在父级中寻找相反的方法呢?
是否可以执行$(this)的相反操作? 因此,它不是获取 this 元素,而是获取与 .sb-popular-thumb a 匹配但不包括 $(this) 的所有内容? 请参阅下面的示例代码。我已用
这是一个关于术语的问题。 考虑到有一个方法使用词法this: var foo = { method: function () { console.log(this, ' is the co
我想问你是否存在一个与 WHERE IN 相反的命令,我想选择数组中具有不同参数的所有行。 1 && id <> 2 && id <> 3"; // how can i do the same q
是否有语法来获取不在给定切片内的列表元素?给定切片 [1:4] 很容易得到这些元素: >>> l = [1,2,3,4,5] >>> l[1:4] [2, 3, 4] 如果我想要列表的其余部分,我可以
这个问题在这里已经有了答案: How can I remove a specific item from an array? (138 个回答) 关闭8年前。 JavaScript push(); 方
在此先感谢您的帮助。这是一个很棒的社区,我在这里找到了许多编程答案。 我有一个包含多个列的表,其中5个包含日期或null。 我想编写一个本质上将5列合并为1列的sql查询,条件是如果5列中的1包含“N
我使用 hasClass() 在 if 语句中验证元素是否具有给定的类。 如果元素没有给定的类,如何检查 if 语句?预先感谢您的回复。 最佳答案 为什么不简单地: if (!el.hasClass(
我有一个 std::vector v我想防止进一步写入它。 C++ 编译器不接受这个 const std::vector& w = v; 但它接受这个 const std::vector& w = r
这个问题已经有答案了: How to reshape data from long to wide format (14 个回答) 已关闭 7 年前。 我有像这样的巨大数据框: SN = c(1:10
如何将可调用(匿名函数)转换为字符串进行评估? 我正在尝试在 phpunit 中编写使用 runkit 的单元测试覆盖方法。特别是,runkit_method_redefine() 需要一个字符串参数
我想实现一个堆栈(队列),许多用户可以以 FILO 方式将其推送(),并且许多用户可以从中弹出()。 是否有与 pop() 等效的方法来检索/删除列表的最后一项? 例如: var popRef = f
我想知道“无状态协议(protocol)”的反面是什么。例如,鉴于 HTTP 是无状态的,那么像 FTP 这样的协议(protocol)是相反的/维护状态的协议(protocol),我的假设是否正确?
我对array_filter很熟悉,想往功能上想,但我想知道有没有办法保留被丢弃的值?例如,如果我有一个像这样的数组: 2; }); 结果将是:array( 3, 4 )。 有没有办法保留丢弃的值
我已将色轮的图像加载到 Canvas 上,并且在数组中有一个色相值列表。我遍历 Canvas 上的每个像素,并删除匹配相同色相值的像素。 该代码是: var element = document.ge
这个问题在这里已经有了答案: Repeat each row of data.frame the number of times specified in a column (10 个答案) 关闭
如何将可调用(匿名函数)转换为字符串以进行评估? 我正在尝试在使用 runkit 的 phpunit 中编写单元测试覆盖方法。特别是,runkit_method_redefine() 需要一个字符串参
我对array_filter很熟悉,想往功能上想,但我想知道有没有办法保留被丢弃的值?例如,如果我有一个像这样的数组: 2; }); 结果将是:array( 3, 4 )。 有没有办法保留丢弃的值
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!