服务器端:
服务器端有两个套接字—QTcpServer(监听套接字)、QTcpSocket(通信套接字) 。为实现QT环境下的网络编程首先应在“pro”工程文件中添加QT += network ,如下图所示:
接着便可以着手编写服务端程序,首先在头文件中声明两个套接字,在服务器主函数中,使用监听套接字调用listen()函数。
/*动态分配通信套接字**/
tcpSocket = NULL ;
/*动态分配监听套接字**/
tcpServer = new QTcpServer(this) ;
/*监听**/
tcpServer->listen(QHostAddress::Any,8888) ;//第一个参数为系统默认,第二个参数为端口号
/*设定窗口名称**/
this->setWindowTitle("服务器:8888");
实现以上步骤之后服务器便会等待连接,当连接成功之后,对方的通信套接字会发送newConnection() 信号,当接到该信号之后服务器便建立通信套接字和对方的通信套接字进行通信。在通信过程中若对方成功发送信息,服务器会收到readyRead()信号,之后在相应的槽函数中实现传输数据的显示。具体代码如下所示:
/ *信号与槽:用以判断是否链接成功,若链接成功则建立好通信套接字**/
connect(tcpServer,&QTcpServer::newConnection,
[=]()
{
/*分配通信套接字的空间,注意该空间为监听套接字队列中的对象**/
tcpSocket = tcpServer->nextPendingConnection() ;
/*提供通信套接字的相关信息**/
QString Ip = tcpSocket->peerAddress().toString() ;
qint16 port = tcpSocket->peerPort() ;
/*提示链接成功信息**/
QString temp = QString("[%1:%2],成功链接!").arg(Ip).arg(port) ;
ui->textEditRead->setText(temp);
connect(tcpSocket,&QTcpSocket::readyRead,
[=]()
{
//从通信套接字中取出信息
QByteArray info = tcpSocket->readAll() ;
ui->textEditRead->append(info);
}
);
}
) ;
以上步骤已经实现了通信连接和接受数据部分,因此接下来要实现发送数据部分,首先在UI界面中画一个按钮命名为Send 之后转到相应的槽函数编写一下代码:
void ServerWidget::on_ButtonSend_clicked()
{
if(NULL == tcpSocket)
return ;
/*获取编辑框的信息**/
QString str = ui->textEditRead->toPlainText() ;
/*通信套接字发送信息**/
tcpSocket->write(str.toUtf8().data()) ;
}
最后实现服务器端的断开连接,创建Close按钮,跳转槽函数。代码如下:
void ServerWidget::on_pushButton_2_clicked()
{
if(NULL == tcpSocket)
return ;
/*断开连接**/
tcpSocket->disconnectFromHost();
/*关闭通信套接字**/
tcpSocket->close();
}
服务器的UI布局如下图所示:
客户端:
客户端只涉及QTcpSocket(通信套接字),首先实现客户端与服务器连接,创建一个Connect按钮跳转槽,代码编写如下:
void Client::on_ButtonConnect_clicked()
{
/*获取服务器信息**/
QString IP = ui->lineEditIP->text(); // Ip地址
qint16 port = ui->lineEditPort->text().toInt(); //端口号
/*建立连接**/
tcpSocket->connectToHost(QHostAddress(IP),port);
}
连接成功之后客户端的通信套接字会接受connected()信号以此来编写槽函数来提示用户连接成功:
connect(tcpSocket,&QTcpSocket::connected,
[=]()
{
/*连接好之后打印提示字节**/
ui->textEditRead->setText("连接成功!");
}
);
同样当连接成功之后,服务器像客户端传送数据会触发readyRead()信号,接受到该信号之后在相应的槽函数中实现数据显示:
connect(tcpSocket,&QTcpSocket::readyRead,
[=]()
{
/*从信号套接字中取出信息**/
QByteArray temp = tcpSocket->readAll() ;
/*显示**/
ui->textEditRead->append(temp);
}
) ;
最后实现服务器断开连接,建立Close按钮,跳转槽函数:
void Client::on_ButtonClose_clicked()
{
/*断开连接**/
tcpSocket->disconnectFromHost();
/*关闭**/
tcpSocket->close();
}
客户端的UI界面如下所示: