我遇到了这个问题,我只需要读取从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实例。

10-08 07:08
查看更多