まえがき
この記事は主に初心者を対象としています。 記述の目的は、ネットワークとソケットを最初に理解するための、ソケットの迅速かつ詳細な説明です。 あるときは似たようなものを探していましたが、詳細な例が必要でした。 標準的な例では、qtに付属するfortuneサーバー/クライアントは、非常に貧弱なソケット機能を示しています。
したがって、サーバーは次のことができます。
- 任意のアドレス、ポートを「聞く」
- 顧客を名前で認証する
- 一般的なプライベートサーバーメッセージを送信する
- ユーザーリストを送信
クライアントは適切なリクエストをサーバーに送信できます。
理解のために、これらはGooeyアプリケーションになります。

qtには、ソケットを操作するためのQTcpSocketクラスとQTcpServerクラスがあります。 シグナルとスロットを使用して、非ブロッキング(非同期モード)でそれらを操作できます。 これは、サーバーへの接続に顕著な時間がかかる場合、GUIはブロックせず、イベントの処理を続行し、接続(またはエラー)が発生すると、特定のスロットが呼び出されることを意味します(現在の場合、connected()信号に接続されています)。
お客様
簡単なものから始めましょう-クラスを継承しませんが、QTcpSocketを使用します。
一般に、ソケットを操作するときは、データをバイトのセットとして見る必要があります。そうしないと、情報を部分的にしか表示できないという問題が発生する場合があります(完全なメッセージが到着せず、次のメッセージは前のメッセージとともに表示されます)。 これらのトラブルを回避するために、データストリーム(QDataStream)を使用して、最初の2バイトが現在のブロックのサイズであり、3バイト目がサーバーへのクライアントコマンド(またはサーバー応答)であり、残りはコマンドに応じたデータであるソケット間でブロックを転送します。 tcpプロトコルはすべてのパケットの配信を保証するので、処理する前にブロックのフルサイズを安全に待つことができます。
それはすべてクライアントにあります-主なポイントが説明され、残りは非常に簡単です。
サーバー
サーバーではすべてがより複雑になります。GUI(ダイアログ)、サーバー(myserver)、クライアント(myclient)を分離します。 ソケットに慣れていない人は、どのクライアントがサーバーにいるかを理解できないかもしれません。 したがって、サーバーにサーバーにソケットを接続すると、原則として、「クライアント」ソケットが作成され、これが配列に追加されます(結合配列を使用することをお勧めしますが、簡単にするためにQListを使用します)。
QTcpServerからクラスを継承します。これは、着信接続がインターセプトされる仮想関数incomingConnectionをオーバーライドするために必要です(入力パラメーターはソケット記述子です)
クライアントクラスの場合、おそらくインターフェイスのみを説明する価値があります。ここでは、類推によってすべてが明確になっています。 MyClientはQTcpSocketから継承する必要はありません。別の方法で行うことができます。
2017年更新 :
悲しいかな、ソースコードはすでに永遠に失われています
2018年更新 :
ご存知のように、これまでインターネットにアップロードされたすべてのものは永遠にそこに残ります。
vladpower ソースのおかげで
再び利用可能です