序文
サーバー側のクライアント側の場合、それは2つの機能に分かれて、サーバ側で(サーバー側が私の前のテキストを表示することができます)比較的簡単です:1.サーバーソケットへのサーバ2の送信データへの接続を確立します単語
実現
1.サーバー側への接続を確立
まず、我々は接続を確立するために誰と知っている必要がありますので、我々は我々が使用するIPアドレスを入力するかどうかをテストして、ターゲットとの接続を確立するためにQTcpSocket connectToHost()関数を使用するオブジェクトを使用するQHostAddress対象物を必要とする、関数は2を受け入れますパラメータ、最初のパラメータは、IPアドレスで、2番目のパラメータはポートです。機能を使用する場合、サーバーは、私たちのアクセスに耳を傾けることができるようになります。
サーバーにデータを送信するために2ソケット
変数は、この動作は、wirte()関数はオブジェクト同様QTcpSocketによって呼び出され実現することができるリードデータwirte()関数の逆数で、関数は、2つのパラメータを受け取り、最初のパラメータが格納されたデータには伝達されように、第2のパラメータは、送信されたバイト数です。
特定のコード
コードの.cpp一部に次のコード、コード参照<< Qt5開発および実施例(第3版)>>理解が存在したい誤り訂正があった場合
れるtcpClient ::れるtcpClient(QWidgetの* 親、Qtの:: WindowFlags F) :QDialog(親、F) { // 界面初始化 setWindowTitle(TR(" TCPクライアント" )); contentListWiget = 新しいQListWidget。 sendLineEdit = 新にQLineEdit。 及びSendBtn = 新しいのQPushButton(TR(" 送信" )); userNameLabel = 新しい QLabel(TR(" ユーザー名:" )); userNameLineEdit = 新にQLineEdit。 serverIPLabel= 新しい QLabel(TR(" サーバアドレス:" )); serverIPLineEdit = 新にQLineEdit。 portLabel = 新しい QLabel(TR(" ポート" )); portLineEdit = 新にQLineEdit。 enterBtn = 新しいのQPushButton(TR(" チャットルームを入力してください" )); mainLayout = 新しい QGridLayout(この); mainLayout - > addWidget(contentListWiget、0、、0 1、2 )。 mainLayout - > addWidget(sendLineEdit、1、0 ); mainLayout - > addWidget(及びSendBtn、1、1 )。 mainLayout - > addWidget(userNameLabel、2、0 ); mainLayout - > addWidget(userNameLineEdit、2、1 )。 mainLayout - > addWidget(serverIPLabel、3、0 ); mainLayout - > addWidget(serverIPLineEdit、3、1 )。 mainLayout- > addWidget(portLabel、4、0 ); mainLayout - > addWidget(portLineEdit、4。 、1。); mainLayout - > addWidget(enterBtn、5、0、1、2 ); ステータス = falseに ; // ステータスは、現在の状態を示し真のIMが示すチャットルーム、偽の休暇に入ったその ポート= 8010 ; // サーバへのポートが一致している portLineEdit-> のsetText(QStringの::番号(ポート)); サーバIP = 新新 QHostAddress(); //は、初期化QHostaddressオブジェクト 接続(enterBtn、SIGNALは(クリック())、これは、SLOT(slotEnter())); 接続(及びSendBtn、SIGNALは(())、クリックされたこの;、SLOT(slotSend())) 及びSendBtn >は、setEnabled( - falseに)。 } れるtcpClient ::〜れるtcpClient() { } 無効れるtcpClient :: slotEnter() { IF(!ステータス) { QStringのIP = serverIPLineEdit->テキストを(); // テキストボックスのアドレス取得 IFを(serverIP-> setAddress(! IP))// 確認するために、名前とアドレスを取得します { QMessageBox ::情報(この(、TRを"エラー")、TR(" サーバーのIPアドレスエラー!" )); リターン; } 場合(userNameLineEdit->テキスト()== "" ) { QMessageBox ::情報(これ、TR(" エラー")、TR(" ユーザー名エラー" )); リターン; } のuserName = userNameLineEdit-> テキスト(); tcpSocket = 新しい QTcpSocket(この); // 初始化一个QTcpSocket的对象 (TCPsocket、SIGNAL(接続())、接続このスロット(slotConnected())); // 接続が成功した後に接続している場合()信号 接続(TCPsocket、SIGNAL(切断())、このスロット(slotDisconnectedを() )); // IF()シグナリング接続が切断切断される (TCPsocket、信号(readyRead(接続))、このスロット(DateReceived())); // コンテンツサーバーが情報を返すときに、テキストボックスを更新 TCPsocketを- > connectToHost(*サーバIP、ポート); // ターゲットIP、接続ポート構築 ステータス= trueにし; } 他{ int型の長さ= 0 ; QStringのMSGは、 userNameに+ TRを=(":チャットルームを残す" ); IF((長さ= tcpSocket->書き込み(msg.toLatin1()、msg.length()))= msg.lengthを())!// 残すチャットルームサーバーを文字列に { 返す; } TCPsocket ;> disconnectFromHost() - //はソケット閉じよう =ステータスをfalseに; } } 無効れるtcpClientを:: slotConnected()// 接続が成功した後の信号を受け、に「のチャットルームを入力し、」文字列を送信サーバ { 及びSendBtn - >(setEnabled 真の); enterBtn - >のsetText(TR(" 残します" ))。 int型の長さ= 0 ; QStringのMSGは、 userNameに+ TR(= " チャットルーム入力" ); IF(!(長さ= tcpSocket->書き込み(msg.toLatin1()、msg.length()))=をmsg.length()) { リターン; } } 無効れるtcpClient :: slotSendを()// テキストボックスを読み取り、送信キーを押すと、サーバにコンテンツ送信 { がiF(sendLineEdit->テキスト()== "" ) { リターン; } QStringのMSG = + userNameに" :" + sendLineEdit-> テキスト(); TCPsocket - >(msg.toLatin1()、msg.length())を書く; sendLineEdit - > クリア(); } 無効れるtcpClientを:: slotDisconnected()// 一旦接続ボタンができ再び押された切断 { 及びSendBtn - (> setEnabled falseに); enterBtn - >のsetText(" チャットルーム入力" ); } 無効れるtcpClientを:: DateReceivedザ・()// メッセージがテキストボックス更新するときに、サーバーによって送信されたデータを読み込む { しばらく(tcpSocket-> bytesAvailableプロパティを()> 0 ) { QByteArrayデータグラム; datagram.resize(TCPsocket - > bytesAvailableプロパティ()); TCPsocket - >(datagram.data()、datagram.size())を読み取ります。 QStringのMSG = datagram.data()。 contentListWiget - > のaddItem(msg.left(datagram.size())); } }