QT 5下udpプログラミング例


以下に、簡単なQT 5でのudp通信の次の例を示す.サーバはタイマを利用してsocketにブロードキャストメッセージを送信し続け、クライアントはこのメッセージを受信して表示することができる.
まずプロジェクトUdpServerを構築する.pro.各コントロールのレイアウトを作成します.
udpserver.h:

class UdpServer:public QDialog
{
Q_OBJECT
public:
UdpServer(QWidget *parent=0,Qt::WindowFlags f=0);
~UdpServer();

prvate:
QLabel *TimerLabel;
QLineEdit *TextLineEdit;
QPushButton *StartBtn;
QVBoxLayout *mainLayout;
};

udpserver.cpp

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

TimerLabel = new QLabel(tr("Timer:),this);
TextLineEdit = new QLineEdit(this);
StartBtn = new QPushButton(tr("Start"),this);

mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(TimerLabel);
mainLayout->addWidget(TextLineEdit);
mainLayout->addWidget(StartBtn);

}

以下にサーバのメッセージブロードキャスト機能を実現する:UdpServer.Proに追加:
QT+=networkでネットワーク開発をサポートできます.
udpserverでhに希望するスロット関数を追加
public slots:
void StartBtnClicked();
void timeout();

privateint port;
bool isStarted;
QDdpSocket *udpSocket;
QTimer *timer;

ソースファイルudpserver.cppのコンストラクション関数に次のコードを追加します.
conne(startBtn,SIGNAL(clicked()),this,SLOT(StartBtnClicked()));
port = 5555;
isStarted = false;
UDPSocket = new QUdpSocket(this);//    socket
timer = new QTimer(this);//       
connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));

スロット関数の実装:
void UdpServer::StartBtnClicked()
{
if(!isStarted)
{
StartBtn->setText(tr("STOP");
timer->start(1000);//     
isStarted = true;
}
else
{
StartBtn->setText(tr("Start"));
isStarted = false;
timer->stop();
}

}

timeout関数の実装ブロードキャストメッセージ:
void Udpserver::timeout()
{
QString message = TextLineEdit->text();//          
int length = 0//      
if(message= “”)//         ,   
{
return;
}


/*                ,               ,    */
if((length = UDPSocket->writeDatagram(message.toLatin1(),message.length(),QHOSTAddress::Broadcast,port))!=message.length())
{
return;
}
}

*——————————————————————————————————————————————————————————————–
次のudpクライアントの実装.サーバからブロードキャストされたメッセージを取得し、表示します.まず建設工事UdpClient.Pro各コントロールのレイアウトを作成します.udpclient.h:
class UdpClient:public QDialog
{
Q_OBJECT
public:
UdpClient(QWidget *parent =0,Qt::WindowFlags f=0);
~UdpClient();

private:
QTextEdit *ReceiveTextEdit;
QPushButton *CloseBtn;
QVBoxLayout *mainLayout;

};

udpclient.cpp
UdpClient::UdpClient(QWidget *parent,Qt::WindowFlags f):QDialog(parent,f)
{
setWindowTitle(tr("Udp client"));
ReceiveText = new QTextEdit(this);
CloseBtn = new QPushButton(this);

mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(ReceiveTextEdit);
mainLayout->addWidget(CloseBtn);
}

UdpClient.Proに次の文を追加してネットワーク開発をサポートします:QT+=network
udpclient.hに次のコードを追加します.
public slots:
void CloseBtnClicked();
void dataReceived();

privateint port;
QUdpSocket *UDPSocket;

udpclient.cppコンストラクション関数に次のコードを追加します.
connect(CloseBtn,SIGNAL(clicked()),this,SLOT(CloseBtnClicked()));

port = 5555//   

udpSocket = new QUdpSocket(this);//      socket
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));//  readyRead()         

bool result = udpSocket->bind(port);//         
if(!result)//      ,      
{
QMessageBox::information(this,tr(“Error”),tr(“UDP Socket Error”));
return;

}


        

void UdpClient::CloseBtnClicked()/socket{close();}を閉じる
void UdpClient::dataReceived()/データを受信して{while(udpSocket->hasPendingDatagram()//socketにデータが到着したらループの読み出し表示{QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize();udpSocket->readDatagram(datagram.data()、datagram.size()); QString message = datagram.data(); ReceiveTextEdit->insertPlainText(message); } } “`
————————————————————————————————————————————————————————————————————————————————————————————以上は簡単なudpの簡単な通信例であり、コードは簡単な一部しか与えられていない.レイアウトは自分で見て実現できます.