通讯中间件
最近做的一个小项目是通讯中间件,一端与ERP/MES对接,一端与机台工作软件对接。通讯中间件的目的在于,工作软件不需要支持多种协议即可与ERP/MES进行数据交互。换句话说就是工作软件只需要支持一种通讯协议,能够与中间件进行交互即可,其它的交给中间件,不需要理会ERP/MES端支持哪种协议。目前我的中间件支持UDP,TCP,Modbus-Tcp,Opc-Ua四种通讯协议。(以下内容如有错误,还望指正!)
TCP
今天记录TCP通讯的代码和注意事项。直接上代码
服务端
m_server = new QTcpServer;
m_server->listen(QHostAddress(dlg.m_IPstr),9988);
//当服务器有新的客户端连接时,响应槽函数
connect(m_server,SIGNAL(newConnection()),
this,SLOT(slotNewConnect()));
void TcpServer::slotNewConnect()
{
//先判断服务器是否有还未处理的连接
while(m_server->hasPendingConnections())
{
//服务器去获得新的客户端连接,并返回一个socket
m_socket = m_server->nextPendingConnection();
//当这个socket接收到数据时,响应槽函数
connect(m_socket,SIGNAL(readyRead()),this,SLOT(slotReadyRead()));
}
}
void TcpServer::slotReadyRead()
{
//socket先判断是否有接收到数据
while(m_socket->bytesAvailable() > 0)
{
//socket读取所有接收到的数据
QByteArray buf = m_socket->readAll();
}
}
客户端
//创建客户端并连接到指定IP服务端9988端口
m_socketClient = new QTcpSocket;
m_socketClient->connectToHost(dlg.m_IPstr,9988);
connect(m_send,SIGNAL(clicked(bool)),this,SLOT(slotButtonClick()));
void TcpClient::slotButtonClick()
{
QString str = m_EditText->text();
if(str.isEmpty())
return;
//将要发送的数据发出
m_socketClient->write(str.toUtf8());
}
总结
TCP服务端与客户端的连接是同一个IP地址和端口,以上内容是比较简单的通讯交互。