QT 5下udpプログラミング例
以下に、簡単なQT 5でのudp通信の次の例を示す.サーバはタイマを利用してsocketにブロードキャストメッセージを送信し続け、クライアントはこのメッセージを受信して表示することができる.
まずプロジェクトUdpServerを構築する.pro.各コントロールのレイアウトを作成します.
以下にサーバのメッセージブロードキャスト機能を実現する:UdpServer.Proに追加:
QT+=networkでネットワーク開発をサポートできます.
udpserverでhに希望するスロット関数を追加
ソースファイルudpserver.cppのコンストラクション関数に次のコードを追加します.
スロット関数の実装:
timeout関数の実装ブロードキャストメッセージ:
*——————————————————————————————————————————————————————————————–
次のudpクライアントの実装.サーバからブロードキャストされたメッセージを取得し、表示します.まず建設工事UdpClient.Pro各コントロールのレイアウトを作成します.udpclient.h:
udpclient.cpp
UdpClient.Proに次の文を追加してネットワーク開発をサポートします:QT+=network
udpclient.hに次のコードを追加します.
udpclient.cppコンストラクション関数に次のコードを追加します.
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の簡単な通信例であり、コードは簡単な一部しか与えられていない.レイアウトは自分で見て実現できます.
まずプロジェクト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();
private:
int 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();
private:
int 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の簡単な通信例であり、コードは簡単な一部しか与えられていない.レイアウトは自分で見て実現できます.