您的位置:首页 > 编程语言 > Qt开发

【Qt5开发及实例】30、实现客户端的编程,UDP协议

2015-02-27 22:01 399 查看

udpclient.h

/**
* 书本:【Qt5开发及实例】
* 功能:实现客户端的编程
* 文件:udpclient.h
* 时间:2015年2月5日22:10:30
* 作者:cutter_point
*/
#ifndef UDPCLIENT_H
#define UDPCLIENT_H

#include <QDialog>
#include <QVBoxLayout>
#include <QTextEdit>
#include <QPushButton>
#include <QUdpSocket>

class UdpClient : public QDialog
{
  Q_OBJECT

public:
  UdpClient(QWidget *parent = 0, Qt::WindowFlags f = 0);
  ~UdpClient();

public slots:
  void CloseBtnClicked();
  void dataReceived();

private:
  QTextEdit *ReceiveTextEdit;
  QPushButton *CloseBtn;
  QVBoxLayout *mainLayout;
  int port;   //端口号
  QUdpSocket *udpSocket;    //套接字

};

#endif // UDPCLIENT_H


udpclient.cpp

/**
* 书本:【Qt5开发及实例】
* 功能:实现客户端的编程
* 文件:udpclient.cpp
* 时间:2015年2月5日22:10:30
* 作者:cutter_point
*/
#include "udpclient.h"

#include <QMessageBox>
#include <QHostAddress>

UdpClient::UdpClient(QWidget *parent, Qt::WindowFlags f)
  : QDialog(parent, f)
{
  setWindowTitle(tr("UDP Client"));

  ReceiveTextEdit = new QTextEdit(this);
  CloseBtn = new QPushButton(tr("Close"),this);

  mainLayout=new QVBoxLayout(this);
  mainLayout->addWidget(ReceiveTextEdit);
  mainLayout->addWidget(CloseBtn);
  //初始化界面结束

  connect(CloseBtn, SIGNAL(clicked()), this, SLOT(CloseBtnClicked()));  //关闭

  port = 5555;    //端口号

  udpSocket = new QUdpSocket(this);
  connect(udpSocket, SIGNAL(readyRead()), this, SLOT(dataReceived()));    //收集数据,电报

  bool result = udpSocket->bind(port);    //把udpSocket绑定到相应的端口

  if(!result)   //result为false的话,那么就进行下面的,也就是绑定失败
    {
      QMessageBox::information(this, tr("error"), tr("udp socket create error!"));    //udp协议套接字创建失败
      return;
    }

}

//void CloseBtnClicked();
void UdpClient::CloseBtnClicked()
{
  this->close();    //关闭窗口
}

//void dataReceived();
void UdpClient::dataReceived()
{
  while(udpSocket->hasPendingDatagrams())   //如果有数据报的话
    {
      QByteArray datagram;    //字节流
      datagram.resize(udpSocket->pendingDatagramSize());  //里面那个获得第一个数据报的长度,设定字节流的长度
      udpSocket->readDatagram(datagram.data(), datagram.size());    //读取相应长度的数据报到datagram
      QString msg = datagram.data();    //得到字节流的数据
      ReceiveTextEdit->insertPlainText(msg);    //显示在界面上
    }
}

UdpClient::~UdpClient()
{

}


结果



然后是客户端和服务器端,自己可以改一下地址在两台机器上联网运行,或者就在一台机器上,用同样的本地地址运行:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: