一.服务端
首先,我们要在pro文件中加上一句:
QT +=network
编译一下
然后这样创建好ui,并且将三个按钮转到槽
在父类中写上:
private:
QTcpSocket *tcpSocket;//通信套接字
我们先写connect按钮点击的槽函数:
void ClienWdiget::on_buttonconnect_clicked()
{
//获取服务器端口和IP
QString ip=ui->lineEditIP->text();
qint16 port=ui->lineEditPort->text().toInt();
//主动和服务器建立链接
tcpSocket->connectToHost(QHostAddress(ip),port);
}
一旦connectToHost链接成功,那么就会客户端的 newConnection信号(见下面的客户端代码)就会被触发
我们来看一下构造函数:
ClienWdiget::ClienWdiget(QWidget *parent) :
QWidget(parent),
ui(new Ui::ClienWdiget)
{
ui->setupUi(this);
setWindowTitle("客户端");
tcpSocket=NULL;
tcpSocket=new QTcpSocket(this);
connect(tcpSocket,&QTcpSocket::connected,//当链接成功的时候会触发connected信号
[=]()
{
ui->textEditRead->setText("链接成功");
}
);
connect(tcpSocket,&QTcpSocket::readyRead,//对方发送消息成功后会自动触发这个信号
[=]()
{
//获取对方发送的内容
QByteArray array=tcpSocket->readAll();
//追加到编辑区
ui->textEditRead->append(array);
}
);
}
如果链接成功,就会触发connected这个信号,这个可以当作是判断是否链接成功的标志
如果和对方断开链接,自动触发disconnected信号
如果对方发送信息成功,就会触发readyRead信号
ui界面中的Text Edit有一个属性readOnly:
选定之后这个文本框是只读,不能输入文本
二.客户端
private:
QTcpServer *tcpServer;//监听套接字
QTcpSocket *tcpSocket;//通信套接字
构造函数:
ServerWidget::ServerWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::ServerWidget)
{
ui->setupUi(this);
setWindowTitle("服务端");
tcpServer=NULL;
tcpSocket=NULL;
//动态分配空间
//指定父对象,自动回收空间
tcpServer=new QTcpServer(this);
tcpServer->listen(QHostAddress::Any,8888);//任何IP地址,端口是8888
connect(tcpServer,&QTcpServer::newConnection,//如果链接成功,就会自动触发newConnection信号
[=]()
{
//取出建立好链接的套接字
tcpSocket=tcpServer->nextPendingConnection();
//获取对方的IP和端口
QString ip=tcpSocket->peerAddress().toString();
qint16 port=tcpSocket->peerPort();
QString temp=QString("[%1:%2]:成功链接").arg(ip) .arg(port);
ui->textEditRead->setText(temp);
//如果对方发送信息成功,就会触发readRead
connect(tcpSocket,&QTcpSocket::readyRead,
[=]()
{
//从通信套接字中取出内容
QByteArray array=tcpSocket->readAll();
ui->textEditRead->append(array);
}
);
}
);
}
效果图: