【问题标题】:Read data from mirth connect - tcp server qt creator从 mirth connect 读取数据 - tcp server qt creator
【发布时间】:2015-09-25 23:09:21
【问题描述】:

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

【问题讨论】:

    标签: qt tcp message hl7 mirth


    【解决方案1】:

    您应该将网络连接视为具有不同阶段的过程:连接、有效负载传输、关闭。使用有限大小的数据包传输网络信息。数据包之间的时间间隔在 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()等信号。当套接字断开连接时,通过从 disconnected 套接字处理程序调用的延迟 socket-&gt;deleteLater() 将其删除是很有用的。

    需要注意异步解决方案,因为可能同时有许多连接。因此,应该管理QTcpSocket 的许多不同实例。

    【讨论】:

    • 泰!只需要 waitForReadyRead 和繁荣!完美运行
    【解决方案2】:

    您需要在 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";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多