相对于TCP/IP来说,UDP更像是发快递和写信,不需要判断和对方是否连通就可以发送,而TCP/IP必须确认连通之后才可以发送,这样UDP通讯其实不能严格按照TCP/IP的说法区分服务器和客户端,对于每一个客户端来说,只要知道对方地址和端口就可以直接发送,看是一个客户端身份,但是要想接受来自其它客户端发来的消息,就得绑定端口号,如果不绑定,只能发送信息,不能接收,这样看又是一个服务器身份。
参考代码如下:
客户端.h文件:
#ifndef UDPSOCEKT_H
#define UDPSOCEKT_H
#include
#include
#include
#include
namespace Ui {
class udpSocekt;
}
class udpSocekt : public QWidget
{
Q_OBJECT
public:
explicit udpSocekt(QWidget *parent = );
~udpSocekt();
private slots:
void on_sendbutton_clicked();
void on_closebutton_clicked();
void dealdata();
private:
Ui::udpSocekt *ui;
QUdpSocket *Udpsocket;
};
#endif // UDPSOCEKT_H
客户端.CPP文件:
#include "udpsocekt.h"
#include "ui_udpsocekt.h"
udpSocekt::udpSocekt(QWidget *parent) :
QWidget(parent),
ui(new Ui::udpSocekt)
{
ui->setupUi(this);
setWindowTitle("客户端1:6666");
Udpsocket = new QUdpSocket(this);
//绑定端口(声明自己的端口)以便别人访问
Udpsocket->bind();
connect(Udpsocket,&QUdpSocket::readyRead,this,&udpSocekt::dealdata);
}
udpSocekt::~udpSocekt()
{
delete ui;
}
void udpSocekt::dealdata()
{
char buf[] = {};//读取对方的内容长度
QHostAddress Addr;//对方地址
quint16 port;//对方端口
qint64 str = Udpsocket->readDatagram(buf,sizeof(buf),&Addr,&port);
if(str>)
{
//字符串组包
QString showData = QString("[%1:%2] %3").arg(Addr.toString()).arg(port).arg(buf);
ui->display->append(showData);
}
}
void udpSocekt::on_sendbutton_clicked()
{
//从输入框获取端口和访问的IP
QString ip = ui->ip->text();
quint16 port = ui->port->text().toInt();
QString text = ui->send->text();
//执行发送
Udpsocket->writeDatagram(text.toUtf8(),QHostAddress(ip),port);
}
void udpSocekt::on_closebutton_clicked()
{
Udpsocket->disconnectFromHost();
Udpsocket->close();
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章