--------QLocalSocket
用于本地进程间套接字通信
1、清理server并且开始监听
QLocalServer::removeServer("ServerName");
m_server->listen("ServerName");
2、 serverNewConnectionHandler处理监听连接后绑定read回调函数socketReadyReadHandler
3、 m_server->nextPendingConnection();获取一个server socket负责本次连接,
处理结束后deletelater
4、处理过程就是业务逻辑read+write
服务器代码:
m_server = new QLocalServer;
private:
QLocalServer *m_server;
connect(m_server, SIGNAL(newConnection()), SLOT(serverNewConnectionHandler()));
监听到一个新的连接请求触发槽函数
通过调用nextPendingConnection()响应一个等待中的连接请求,返回一个指针,指向用于与client建立通信的QLocalSocket。
serverNewConnectionHandler()--------------m_server->nextPendingConnection()
用于和client建立联系的socket server 进行接收函数和断开连接的槽绑定
QLocalSocket* socket = m_server->nextPendingConnection();
connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyReadHandler()));
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
用来读取client发送信息并且返回给client:
对应read和write
void socketReadyReadHandler()
{
QLocalSocket* socket = static_cast<QLocalSocket*>(sender());
if (socket)
{
QTextStream stream(socket);
qDebug() << "Read Data From Client:" << stream.readAll();
QString response = "Hello Client";
socket->write(response.toUtf8());
socket->flush();
}
// 返回到客户端的void sendMessage 方法,m_socket->waitForReadyRead()之后的操作
}
客户端代码:
--------QLocalSocket
1、创建对象CClient client;
2、连接服务端client.ConnectToServer("ServerName");
3、发送消息client.sendMessage("Hellow Server");
4、断开连接,释放指针
m_socket->disconnectFromServer();
delete m_socket;
代码解读:
m_socket = new QLocalSocket();
connect(m_socket, SIGNAL(connected()), SLOT(socketConnectedHandler()));
connect(m_socket, SIGNAL(disconnected()), SLOT(socketDisConnectedHandler()));
connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), SLOT(socketErrorHandler(QLocalSocket::LocalSocketError)));
连接成功槽
断开连接槽
使用过程错误信息槽
void socketConnectedHandler()
{
qDebug() << "connected.";
}
void socketDisConnectedHandler()
{
qDebug() << "disconnected.";
}
void socketErrorHandler(QLocalSocket::LocalSocketError error)
{
qWarning() << error;
}
--------QLocalSocket
--------QTcpSocket
server端代码:
1、new QTcpServer(this); 创建QTcpServer对象
2、m_tcpServer->listen(QHostAddress::Any,19999);设置监听的端口
3、connect(m_tcpServer,SIGNAL(newConnection()),this,SLOT(newConnect())); 定义一个新连接槽
4、获取连接的socket 并且绑定读取槽
5、读取client发送的信息,wirte返回给client
void Testnet::newConnect()
{
m_tcpSocket = m_tcpServer->nextPendingConnection(); //得到每个连进来的socket
connect(m_tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage())); //有可读的信息,触发读函数槽
//断开自动清楚资源deletelater槽
}
void Testnet::readMessage() //读取信息
{
QByteArray qba= m_tcpSocket->readAll(); //读取
qDebug()<<qba;
m_tcpSocket->write(strMesg.toStdString().c_str(),strlen(strMesg.toStdString().c_str())); //发送
}
client端代码:
1、创建对象,终止当前连接并且扔掉缓冲区数据
2、连接服务器:端口m_tcpSocket->connectToHost("192.168.1.178",19999);
3、发送数据m_tcpSocket->write(ss.toStdString().c_str(),strlen(ss.toStdString().c_str()));
4、读取信息槽绑定connect(m_tcpSocket,SIGNAL(readyRead()),this,SLOT(readMesg()));
5、清理连接close,delete
注意事项:
1)只有使用waitForConnected()后,QTcpSocket才真正尝试连接服务器,并返回是否连接的结果
//循环连接
//Wait for LocalCommunicate established
while(!LocalCommunicate::instance()->waitForConnected()) {
QThread::msleep(500);
LocalCommunicate::instance()->setServerName(LOCALSERVER);
LocalCommunicate::instance()->connectToServer(QIODevice::ReadWrite);
}
2)避免内存泄露 connect(myClient, SIGNAL(disconnected()),myClient, SLOT(deleteLater()));
connect(m_tcpSocketConnected, SIGNAL(disconnected()), this, SLOT(slotTCPDisConnected()));
也可在这里直接执行deleteLater
--------QTcpSocket