我遇到了这个问题,我只需要读取从mirth connect发送的消息(普通文本或hl7)就可以在软件中接收并在数据库中写入消息,这是我的tcpserver代码:
MyServer::MyServer(QObject *parent):
QObject(parent)
{
server = new QTcpServer(this);
connect(server,SIGNAL(newConnection()),this,SLOT(newConnection()));
if(!server->listen(QHostAddress::Any,1234))
{
qDebug() << "Server not start!";
}
else
{
qDebug() << "Server started";
}
}
void MyServer::newConnection()
{
QTcpSocket *socket = server->nextPendingConnection();
qDebug() << "Client agree";
QString data = QTextCodec::codecForMib(1015)->toUnicode(socket->readAll());
qDebug() << socket->readAll();
socket->flush();
socket->waitForBytesWritten(3000);
socket->close();
}
我认为问题出在socket->readall();但是这行代码把客户端发送的所有字节都取出来,写在控制台上,什么都不显示,有人能帮我吗?
最佳答案
您应该将网络连接看作是一个具有不同阶段的进程:连接、有效负载传输、关闭。使用有限大小的数据包传输网络信息。数据包之间的时间间隔在CPU时钟的规模上足够大。甚至有可能出现严重的超时。因此,为了在包之间使用cpu执行其他任务,网络功能由事件触发。
信号QTcpServer::newConnection()
意味着tcp连接刚刚建立(只有很少的数据包被交换以启动)。因此,无法从QTcpSocket
中读取任何内容。这只是开始。
从那时起,您应该使用指向QTcpSocket
的指针。它也可以处理
异步(处理偶数并退出处理程序,以允许在该线程中调度其他偶数,在GUI线程保持UI处于响应状态的情况下这是必需的),或
同步(这里线程在包之间处于睡眠状态)。
您可以在QAbstractSocket的文档中找到有用的示例,它是QTcpSocket
的基类。
更简单的阻塞连接:
int numRead = 0, numReadTotal = 0;
char buffer[50];
forever {
numRead = socket->read(buffer, 50);
// do whatever with array
numReadTotal += numRead;
if (numRead == 0 && !socket->waitForReadyRead())
break;
}
也有针对特定事件触发的各种信号。例如,当某些新数据可用时会触发
QAbstractSocket::readyRead()
。因此,异步使用:// This slot is connected to QAbstractSocket::readyRead()
void MyServer::readyReadSlot()
{
QByteArray data = socket->readAll();
....
}
也有信号为
QAbstractSocket::disconnected()
、QAbstractSocket::error()
。当套接字断开连接时,通过从套接字处理程序调用延迟的socket->deleteLater()
来删除它是很有用的。需要小心使用异步解决方案,因为可以同时拥有多个连接。因此,应该管理许多不同的
disconnected
实例。