ページ

2013年11月14日木曜日

サーバープログラム:QTcpSocket

Qt GUI アプリケーション でプロジェクトを作成する。

とりあえず接続の確認とボタンを押してクライアント側に文字を送ってみる。

プロジェクト名:tcpServer

tcpServer.pro
#-------------------------------------------------
#
# Project created by QtCreator 2013-11-11T20:59:55
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = tcpServer
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected slots:
    void connection();
    void deleteLater();
    void read();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QTcpServer *tcpServer;
    QTcpSocket *socket;
};

#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
mainwoidow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTcpSocket>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    qDebug("%s", "処理スタート");
    
    ui->setupUi(this);
    
    //QTcpServer *tcpServer;
    int port = 1024;
    
    tcpServer = new QTcpServer(this);
    tcpServer->listen(QHostAddress::Any, port);
    
    // クライアントと接続した時の処理、SLOT関数を作成する。
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(connection()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::connection()
{
    qDebug("%s", "接続完了");
    
    // まず最初に、接続してきたクライアントのソケットを取得する。
    socket = tcpServer->nextPendingConnection();
    
    // 切断したときの処理としてSLOT関数を設定する。
    connect(socket, SIGNAL(disconnected()), this, SLOT(deleteLater()));
    // クライアントからの送信を受信する
    connect(socket, SIGNAL(readyRead()), this, SLOT(read()));
    
    // 一応、クライアントのアドレスを取得する。
    QString ippaddr = socket->localAddress().toString();
    int ippaddr2 = socket->localPort();
    
    qDebug("%s", qPrintable( ippaddr ));    //ip アドレス表示
    qDebug("%d", ippaddr2 );                //ポート番号表示
    
    //クライアントに文字を送信するためのストリームを定義
    QDataStream out(socket);
    out.setVersion(QDataStream::Qt_4_1);
    
    // データを送信。
    QString string = "Send";
    out << quint16(string.size()) <<  string << quint16(0xFFFF);
    
}

/*
 *概要:クライアントが切断時したの処理
*/
void MainWindow::deleteLater()
{
    qDebug("%s", "deleteLater");
}
/*
 *概要:クライアントからの送信を受信
 */
void MainWindow::read()
{
    qDebug("%s", "on_readyRead");
    
    char buffer[128];
    
    socket->read(buffer, socket->bytesAvailable());
    std::string sString(buffer);
    QString qString(sString.c_str());
    
    ui->textEdit->setText(qString);
    qDebug("%s", qPrintable(qString));
    
    qDebug("%s", "on_readyRead end");
}
/*
 *概要:ボタンがクリックされた時にクライアントに送信する
*/
void MainWindow::on_pushButton_clicked()
{
    qDebug("%s", "ボタンがクリックされた");
    
    QDataStream out2(socket);
    out2.setVersion(QDataStream::Qt_4_1);
    
    QString string = "Buton Send";
    out2 << quint16(string.size()) <<  string << quint16(0xFFFF);
}

UI のデザイン
ボタンにはスロットのclicked()を設定している。

動作確認
クライアントソフトはベクターから『TCPテスター』をダウンロードしてインストールする。
参考:クライアントソフトはいろいろありますが『TCPテスター』がいい感じです。

1.作成したサーバプログラムを実行させる。

2.『TCPテスター』で、動作モードでクライアントを選択して、接続ボタンを押す。
ipアドレスはそれぞれ設定して下さい。ポート番号はプログラムで指定した番号。
接続したときに、サーバから文字sendを送っているのが確認できる。

3.クライアントからサーバに文字を送る
『TCPテスター』のASCII文字列に文字を入力して、送信ボタンを押す。

一応、クライアントから送られた文字を受信できているのが確認できる。

3.サーバのプッシュボタンを押すと、『TCPテスター』で、 Buton Send と送られるのが確認できる。

サーバ側のプログラムで、送信の時の文字の先頭や、受信時の文字の最後に変な空白か何かが在るが、とりあえずは、送受信が確認できた。

備考:
このプログラムを書いたのが、Qtを使って1週間くらいなので、まだわからないことが多い。







0 件のコメント:

コメントを投稿