Qt によるネットワークプログラミング
Qt Network モジュールは、TCP/IPクライアントおよびサーバーを作成するためのクラスを提供します。このモジュールには、低レベルのネットワーク概念を表すQTcpSocket 、QTcpServer 、QUdpSocket などの低レベルクラスと、一般的なプロトコルを使用してネットワーク操作を実行するためのQNetworkRequest 、QNetworkReply 、QNetworkAccessManager などの高レベルクラスが用意されています。
Qt Network また、ネイティブのTLSバックエンド、OpenSSLツールキット、または適切なTLSプラグインを使用した、トランスポート層セキュリティ(TLS)およびセキュリティ機能のためのAPIも提供しています。詳細については、「Secure Sockets Layer(SSL)クラス」を参照してください。
Qt Network のネットワークプログラミング用クラス
この Qt Network C++ Classes ページには、Qt Network に含まれるC++クラスの一覧が掲載されています。
HTTP に関する高レベルのネットワーク操作
Network Access API は、一般的なネットワーク操作を実行するためのクラスの集合です。この API は、使用される特定の操作やプロトコル(たとえば、HTTP 経由でのデータの取得や送信)の上に抽象化レイヤーを提供し、一般的または高レベルの概念に関するクラス、関数、シグナルのみを公開します。
ネットワークリクエストは `QNetworkRequest ` クラスによって表現され、このクラスは、ヘッダー情報や使用される暗号化方式など、リクエストに関連する情報の一般的なコンテナとしても機能します。リクエストオブジェクトの構築時に指定された URL によって、そのリクエストで使用されるプロトコルが決定されます。現在、アップロードおよびダウンロードには HTTP およびローカルファイルの URL がサポートされています。
ネットワーク操作の調整は、QNetworkAccessManager クラスによって行われます。リクエストが作成されると、このクラスを使用してリクエストをディスパッチし、進行状況を報告するためのシグナルを発行します。また、このマネージャーは、クライアントへのデータ保存のためのcookies の使用、認証リクエスト、およびプロキシの使用も調整します。
ネットワークリクエストへの応答はQNetworkReply クラスによって表され、これらはリクエストがディスパッチされた際にQNetworkAccessManager によって生成されます。QNetworkReply が提供するシグナルを使用して各レスポンスを個別に監視することもできますが、開発者は代わりにマネージャーのシグナルをこの目的で使用し、レスポンスへの参照を破棄することを選択することもできます。QNetworkReply はQIODevice のサブクラスであるため、レスポンスは同期的または非同期的に、つまりブロッキング操作またはノンブロッキング操作として処理できます。
各アプリケーションやライブラリは、ネットワーク通信を処理するために、QNetworkAccessManager のインスタンスを1つ以上作成できます。
QTcpSocket および QTcpServer での TCP の使用
TCP(Transmission Control Protocol)は、HTTP や FTP を含むほとんどのインターネットプロトコルでデータ転送に利用される低レベルのネットワークプロトコルです。これは、信頼性が高く、ストリーム指向かつ接続指向のトランスポートプロトコルです。特に、データの連続的な送信に適しています。

QTcpSocket クラスは、TCPのためのインターフェースを提供します。QTcpSocket を使用することで、POP3、SMTP、NNTPなどの標準的なネットワークプロトコルだけでなく、カスタムプロトコルも実装できます。
データ転送を開始するには、まずリモートホストとポートへのTCP接続を確立する必要があります。接続が確立されると、QTcpSocket::peerAddress() およびQTcpSocket::peerPort() を通じて、相手側のIPアドレスとポートを取得できます。相手側はいつでも接続を閉じることができ、その場合はデータ転送が直ちに停止します。
QTcpSocket QNetworkAccessManager と同様に、非同期で動作し、ステータスの変化やエラーを報告するためにシグナルを発行します。受信データの検出や送信データの自動フラッシュには、イベントループを利用しています。 () を使用してソケットにデータを書き込むことができ、 () を使用してデータを読み取ることができます。 は、読み取り用と書き込み用の2つの独立したデータストリームを表しています。QTcpSocket::write QTcpSocket::read QTcpSocket
QTcpSocket はQIODevice を継承しているため、QTextStream やQDataStream と組み合わせて使用できます。QTcpSocket から読み込む際は、事前にQTcpSocket::bytesAvailable()を呼び出して、十分なデータが利用可能であることを確認する必要があります。
着信するTCP接続を処理する必要がある場合(例:サーバーアプリケーション内)、QTcpServer クラスを使用します。QTcpServer::listen()を呼び出してサーバーを設定し、接続するクライアントごとに1回発せられるQTcpServer::newConnection()シグナルに接続します。スロット内では、QTcpServer::nextPendingConnection()を呼び出して接続を受け入れ、返されたQTcpSocket を使用してクライアントと通信します。
その機能のほとんどは非同期で動作しますが、QTcpSocket を同期的に(つまり、ブロッキング方式で)使用することも可能です。 ブロッキング動作を実現するには、QTcpSocket の waitFor...() 関数を呼び出します。これらは、シグナルが発行されるまで呼び出しスレッドを一時停止させます。たとえば、非ブロッキングのQTcpSocket::connectToHost() 関数を呼び出した後、QTcpSocket::waitForConnected() を呼び出して、connected() シグナルが発行されるまでスレッドをブロックさせます。
同期ソケットを使用すると、多くの場合、制御フローがより単純なコードになります。waitFor...() アプローチの主な欠点は、waitFor...() 関数がブロックしている間はイベントが処理されないことです。GUI スレッドで使用すると、アプリケーションのユーザーインターフェースがフリーズする可能性があります。 このため、同期ソケットは非GUIスレッドでのみ使用することを推奨します。同期的に使用する場合、QTcpSocket はイベントループを必要としません。
Fortune ClientおよびFortune Serverのサンプルでは、QTcpSocket およびQTcpServer を使用してTCPクライアント・サーバーアプリケーションを作成する方法を示しています。また、別のスレッドで(イベントループを使用せずに)同期型のQTcpSocket を使用する方法の例については「Blocking Fortune Client」を、アクティブなクライアント1つにつき1つのスレッドを持つマルチスレッドTCPサーバーの例については「Threaded Fortune Server」を参照してください。
QUdpSocket での UDP の使用
UDP(User Datagram Protocol)は、軽量で、信頼性が低く、データグラム指向の、接続不要のプロトコルです。信頼性が重要でない場合に使用できます。たとえば、時刻を報告するサーバーではUDPを選択できます。時刻を含むデータグラムが失われた場合でも、クライアントは単に別のリクエストを送信すれば済みます。

QUdpSocket クラスを使用すると、UDPデータグラムの送受信が可能です。このクラスはQAbstractSocket を継承しているため、QTcpSocket のインターフェースの大部分を共有しています。主な違いは、QUdpSocket がデータを連続したデータストリームとしてではなく、データグラムとして転送する点にあります。 要するに、データグラムとは、転送されるデータに加えて、送信元および受信先のIPアドレスとポートを含む、サイズが制限された(通常は512バイト未満)データパケットのことです。
QUdpSocket IPv4のブロードキャストに対応しています。ブロードキャストは、ネットワーク上のどのホストが最も多くの空きディスク容量を持っているかを見つけるなど、ネットワーク検出プロトコルを実装するためによく使用されます。あるホストがネットワークにダグラムをブロードキャストすると、他のすべてのホストがそれを受信します。リクエストを受信した各ホストは、現在の空きディスク容量を記載した応答を送信者に返送します。 発信元は、すべてのホストからの応答を受信するまで待機し、その後、データを保存するための空き容量が最も多いサーバーを選択できます。データグラムをブロードキャストするには、特別なアドレスQHostAddress::Broadcast (255.255.255.255) またはローカルネットワークのブロードキャストアドレス宛てに送信するだけです。
QUdpSocket::bind() は、TCP サーバーのQTcpServer::listen() と同様に、着信データグラムを受け入れる準備をソケットに行います。1 つ以上のデータグラムが到着するたびに、QUdpSocket はreadyRead() シグナルを発行します。データグラムを読み取るには、QUdpSocket::readDatagram() を呼び出します。
「Broadcast Sender」および「Broadcast Receiver」のサンプルでは、Qt を使用して UDP 送信者と UDP 受信者を作成する方法を示しています。
QUdpSocket また、マルチキャストもサポートしています。「Multicast Sender」および「Multicast Receiver」のサンプルでは、UDPマルチキャストクライアントの書き方を示しています。
QHostInfo を使用したホスト名の解決
ネットワーク接続を確立する前に、QTcpSocket およびQUdpSocket は名前解決を行い、接続先のホスト名をIPアドレスに変換します。この操作は通常、DNS(ドメインネームサービス)プロトコルを使用して行われます。
QHostInfo は、このような名前解決を自分で実行できる静的関数を提供しています。ホスト名、QObject ポインタ、およびスロットシグネチャを引数としてQHostInfo::lookupHost() を呼び出すと、QHostInfo は名前解決を実行し、結果が準備でき次第、指定されたスロットを呼び出します。 実際の検索は、オペレーティングシステムが提供する名前解決メソッドを利用して、別のスレッドで実行されます。
QHostInfo また、ホスト名を引数として受け取り、結果を返す静的関数QHostInfo::fromName() も提供しています。 この場合、名前解決は呼び出し元と同じスレッドで実行されます。このオーバーロードは、GUI 以外のアプリケーションや、GUI 以外の別のスレッドで名前解決を行う場合に便利です。(GUI スレッドでこの関数を呼び出すと、関数が名前解決を実行してブロックされている間、ユーザーインターフェースがフリーズする可能性があります。)
ネットワークプロキシのサポート
Qt Network によるネットワーク通信は、ローカルとリモートの接続間のネットワークトラフィックを転送またはフィルタリングするプロキシを介して行うことができます。
個々のプロキシは `QNetworkProxy ` クラスで表され、これを使用してプロキシへの接続を記述および設定します。ネットワーク通信のさまざまなレベルで動作するプロキシタイプがサポートされており、SOCKS 5 によるサポートでは低レベルでのネットワークトラフィックのプロキシ化が可能で、HTTP および FTP プロキシはプロトコルレベルで動作します。詳細については、QNetworkProxy::ProxyType を参照してください。
プロキシ機能は、ソケット単位で有効にすることも、アプリケーション内のすべてのネットワーク通信に対して有効にすることもできます。新しく開かれたソケットについては、接続を行う前にQAbstractSocket::setProxy()関数を呼び出すことで、プロキシを使用するように設定できます。また、QNetworkProxy::setApplicationProxy()関数を使用することで、それ以降のすべてのソケット接続に対して、アプリケーション全体でのプロキシ機能を有効にすることができます。
プロキシファクトリは、プロキシ使用のためのポリシーを作成するために使用されます。QNetworkProxyFactory は、特定のプロキシタイプに対するクエリに基づいてプロキシを提供します。 クエリ自体はQNetworkProxyQuery オブジェクトにエンコードされており、これにより、プロキシの目的(TCP、UDP、TCP サーバー、URL リクエスト)、ローカルポート、リモートホストおよびポート、使用中のプロトコル(HTTP、FTP など)といった主要な基準に基づいてプロキシを選択できます。
QNetworkProxyFactory::proxyForQuery() を使用すると、ファクトリに直接クエリを実行できます。アプリケーション全体のプロキシポリシーは、ファクトリをQNetworkProxyFactory::setApplicationProxyFactory() に渡すことで実装でき、QNetworkProxyFactory をサブクラス化することでカスタムプロキシポリシーを作成できます。詳細については、クラスのドキュメントを参照してください。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.