相对于TCP/IP来说,UDP更像是发快递和写信,不需要判断和对方是否连通就可以发送,而TCP/IP必须确认连通之后才可以发送,这样UDP通讯其实不能严格按照TCP/IP的说法区分服务器和客户端,对于每一个客户端来说,只要知道对方地址和端口就可以直接发送,看是一个客户端身份,但是要想接受来自其它客户端发来的消息,就得绑定端口号,如果不绑定,只能发送信息,不能接收,这样看又是一个服务器身份。
- 互相访问的效果如下:
- 参考代码如下:
客户端.h文件:
1 #ifndef UDPSOCEKT_H 2 #define UDPSOCEKT_H 3 4 #include <QWidget> 5 #include <QUdpSocket> 6 #include <QHostAddress> 7 #include <QString> 8 9 namespace Ui { 10 class udpSocekt; 11 } 12 13 class udpSocekt : public QWidget 14 { 15 Q_OBJECT 16 17 public: 18 explicit udpSocekt(QWidget *parent = 0); 19 ~udpSocekt(); 20 21 private slots: 22 void on_sendbutton_clicked(); 23 24 void on_closebutton_clicked(); 25 26 void dealdata(); 27 private: 28 Ui::udpSocekt *ui; 29 QUdpSocket *Udpsocket; 30 }; 31 32 #endif // UDPSOCEKT_H
客户端.CPP文件:
1 #include "udpsocekt.h" 2 #include "ui_udpsocekt.h" 3 4 udpSocekt::udpSocekt(QWidget *parent) : 5 QWidget(parent), 6 ui(new Ui::udpSocekt) 7 { 8 ui->setupUi(this); 9 setWindowTitle("客户端1:6666"); 10 Udpsocket = new QUdpSocket(this); 11 //绑定端口(声明自己的端口)以便别人访问 12 Udpsocket->bind(6666); 13 connect(Udpsocket,&QUdpSocket::readyRead,this,&udpSocekt::dealdata); 14 } 15 16 udpSocekt::~udpSocekt() 17 { 18 delete ui; 19 } 20 void udpSocekt::dealdata() 21 { 22 char buf[800] = {0};//读取对方的内容长度 23 QHostAddress Addr;//对方地址 24 quint16 port;//对方端口 25 qint64 str = Udpsocket->readDatagram(buf,sizeof(buf),&Addr,&port); 26 if(str>0) 27 { 28 //字符串组包 29 QString showData = QString("[%1:%2] %3").arg(Addr.toString()).arg(port).arg(buf); 30 ui->display->append(showData); 31 } 32 } 33 void udpSocekt::on_sendbutton_clicked() 34 { 35 //从输入框获取端口和访问的IP 36 QString ip = ui->ip->text(); 37 quint16 port = ui->port->text().toInt(); 38 QString text = ui->send->text(); 39 40 //执行发送 41 Udpsocket->writeDatagram(text.toUtf8(),QHostAddress(ip),port); 42 43 } 44 45 void udpSocekt::on_closebutton_clicked() 46 { 47 Udpsocket->disconnectFromHost(); 48 Udpsocket->close(); 49 }