相关代码有已经放入我的资源,有兴趣可前往下载
对于qt下的tcp,如下图:
一.服务器端
1.建立套接字
server=new QTcpServer(this); //监听套接字
server->listen(QHostAddress::Any,8888);//QHostAddress对应网卡ip地址
setWindowTitle("服务器:8888");
2.客户端发过来连接请求槽函数处理,和客户端发过来信息的处理,分别两个槽函数
//第一个槽函数--只要有客户端连接服务器,服务器就会产生newConection的信号,然后对这个信号处理
//获取这个客户端的套接字,然后获取其ip和端口,
//第二个槽函数:只要客户端发过来消息就会触发readyRead信号,然后读取信息内容并显示
connect(server,&QTcpServer::newConnection,
[=]()
{
//取出建立好连接的套接字
st1=server->nextPendingConnection();
//显示谁和我连接:获取ip和端口
QString ip=st1->peerAddress().toString();
qint16 port=st1->peerPort();
//组一个包显示
QString temp=QString("[%1:%2]:成功连接").arg(ip).arg(port);
//将对方连接信息显示在编辑框中
ui->readedit->setText(temp);
connect(st1,&QTcpSocket::readyRead,
[=]()
{
//从通信套接字中取出内容
QByteArray arr=st1->readAll(); //返回值QByteArray
//显示在编辑框中
ui->readedit->append(arr);
}
);
}
);
3.发送信息
void Widget::on_sendbutton_clicked() //用了一个button来发消息
{
if(st1=NULL)
{
qDebug()<<"socket为NULL!";
return ;
}
qDebug()<<"socket不为NULL!";
//获取编辑区内容
QString str2=ui->writeedit->toPlainText();
qDebug()<<str2.toUtf8().data();
st1->write(str2.toUtf8().data()); //发消息
qint64 p1=st1->write("111");
qDebug()<<p1;
}
二.客户端
1.怎么知道连接成功和获取消息
//也是两个槽函数
//第一个用来发送连接请求
//第二个用来获取消息(连接成功socket套接字都会被对方的connected触发)
ClientWidget::ClientWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::ClientWidget)
{
ui->setupUi(this);
setWindowTitle("客户端");
st2=NULL;
//分配空间
st2=new QTcpSocket(this);
connect(st2,&QTcpSocket::connected,
[=]()
{
ui->readedit->setText("连接成功!");
}
);
connect(st2,&QTcpSocket::readyRead,
[=]()
{
//获取对方发送的消息
QByteArray arr2=st2->readAll();
//放入编辑框
ui->readedit->append(arr2);
}
);
}
2.连接
void ClientWidget::on_connectbutton_clicked()
{
//从lineedit中获取服务器端口和ip
QString ip=ui->ipedit->text();
qint16 port=ui->portedit->text().toInt();
//主动和服务器建立连接
st2->connectToHost(QHostAddress(ip),port);
}
3.发送消息(差不多的代码)
void ClientWidget::on_sendbutton_clicked()
{
//获取编辑框内容
QString str=ui->writeedit->toPlainText();
//发送消息
st2->write(str.toUtf8().data());
}
最后,这只是单个服务器单个客户端,然而对于一个服务器多个客户端的情况下,也是可以的。不能多个客户端在于:
st1=server->nextPendingConnection();//只接受了一个通信套接字,每当有新连接就会断开上一个
处理的方法可以把所有的连接放在list里边,然后再处理。
详情见:https://www.techieliang.com/2017/12/530/