从 mirth connect 读取数据 - tcp server qt creator

Read data from mirth connect - tcp server qt creator

我遇到了这个问题,只是我需要读取从 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();但是这条线获取了客户端发送的所有字节并写入控制台并且什么都不显示,有人可以帮助我吗?

你需要在 readAll 之前等待套接字 readyRead 信号。

这是 tcpserver 的一个简单示例

m_server = new QTcpServer();

connect(m_server, &QTcpServer::newConnection, [=]() {
    qDebug() << "new client socket";

    QTcpSocket* socket = this->m_server->nextPendingConnection();

    connect(socket, &QTcpSocket::disconnected, [=]() {
        qDebug() << "client socket disconnected";

        socket->deleteLater();
    });

    connect(socket, &QTcpSocket::readyRead, [=]() {
        qDebug() << "client readyRead";

        QString string = socket->readAll();
        qDebug() << "Read: " << string;
        string = string.toUpper();
        qDebug() << "Send " << string;

        socket->write(string.toLatin1());
        socket->close();
    });
});

m_server->listen(QHostAddress::Any, 8811);
qDebug() << "server listen";

您应该将网络连接视为具有多个阶段的过程:连接、有效负载传输、关闭。网络信息使用有限大小的数据包传输。数据包之间的时间间隔在 CPU 时钟的范围内足够大。甚至可能有明显的超时。因此,要将 CPU 用于数据包之间的其他任务,网络功能由事件触发。

信号QTcpServer::newConnection()表示TCP连接刚刚建立(只交换了几个数据包就开始了)。因此,无法从 QTcpSocket 中读取任何内容。这只是一个开始。

从那时起,您应该使用指向 QTcpSocket 的指针。也可以处理

  • 异步(处理事件并从处理程序退出以允许在该线程中调度其他事件,这在 GUI 线程的情况下是强制性的,以保持 UI 处于响应状态)或
  • 同步(此处线程在数据包之间处于休眠状态)。

您可以在 QAbstractSocket 的文档中找到有用的示例,它是 QTcpSocket 的基础 class。

更简单的阻塞式连接:

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()等信号。当套接字断开连接时,通过从 disconnected 套接字处理程序调用的延迟 socket->deleteLater() 删除它很有用。

需要小心使用异步解决方案,因为它可能同时具有多个连接。因此,应该管理 QTcpSocket 的许多不同实例。