客户端与服务器建立连接
客户端给服务器发送数据
一、tcp服务器的ui界面设计
接受框:Group Box+Plain Text Edit 设置为readonly
端口号:Line Edit
发送窗口:Line Edit
其余按钮:Push Button
二、tcp服务器逻辑业务实现
服务器端需要用到QTcpServer、QTcpSocket对象需要现在头文件中引用,还需要在pro文件的QT中加入network(如果不加入network引入头文件会失败的)
在头文件中定义对象
并在使用文件中new分配内存
2.1监听、新建关联、准备接收
tcp服务器需要监听所有地址的数据(把该功能放进打开服务器按键的槽函数中)
tcpServer ->listen(QHostAddress::Any,ui->portEdit->text().toUInt());
Any表示监听本机的所有网口的,第二个参数表示监听的网络端口。
这段代码表示我要监听所有的网口,端口在我们选择的那个框上的文本转为usignedint类型
如果监听到并建立连接的时候客户端会触发服务器发送一个newConnection信号,因此我们这边需要新建一个connect函数,当收到newConnection信号的时候进入槽函数
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));
void Widget::newConnection_Slot()
{
//使用该函数可以取出已连接的套接字
tcpSocket = tcpServer ->nextPendingConnection();
//当收到readyRead信号表示要读了
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_solt()));
}
当socket发送readyread时候表示客户端发来了文字,我们需要接收并显示
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_solt()));
void Widget::readyRead_solt()
{
QString buff;
buff = tcpSocket ->readAll();
ui ->receiveEdit ->appendPlainText(buff);
}
2.2关闭按键
void Widget::on_closeBt_clicked()
{
//关闭
tcpServer ->close();
}
2.3发送按键
void Widget::on_sendBt_clicked()
{
tcpSocket ->write(ui->sendEdit->text().toLocal8Bit().data());
}
注意SLOT和SIGNAL中的函数需要加括号SLOT(A())这样才对
最后实现结果如下:
三、tcp客户端的ui界面设计
设计界面如下,由于客户端连接时候需要输入服务器ip地址,因此多了一个ip框
四、tcp客户端逻辑功能实现
客户端需要使用QTcpSocket,因此我们需要在pro文件先加入network库再去.h文件加入QTcpSocket文件。
4.1打开客户端
打开客户端时候我们需要主动向服务器发送链接按钮,需要输入ip以及端口,注意端口需要转化为unsigned int类型
void Widget::on_openBt_clicked()
{
//连接主机
// virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
tcpsocket->connectToHost(ui->ipEdit->text(),ui->portEdit->text().toUInt());
connect(tcpsocket,SIGNAL(connected()),this,SLOT(connected_slot()));
}
当完成连接的时候tcpsocket会发送connected信号,进入其槽函数
void Widget::connected_slot()
{
connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot()));
}
槽函数再等待到数据的时候得到得到readyRead信号,这时候需要显示信息
void Widget::readyRead_slot()
{
ui->receiveEdit->appendPlainText(tcpsocket->readAll());
}
4.2关闭按钮以及发送按钮实现
最后将127.0.0.1当作服务器ip即可
void Widget::on_closeBt_clicked()
{
tcpsocket->close();
}
void Widget::on_sendBt_clicked()
{
tcpsocket->write(ui->sendEdit->text().toLocal8Bit().data());
}