TCPにTCPクライアントを使用して、チャットルームQT5(b)に書かれたプロトコルの準備を使用する方法

序文

サーバー側のクライアント側の場合、それは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、00 12 )。
    mainLayout - > addWidget(sendLineEdit、10 ); 
    mainLayout - > addWidget(及びSendBtn、11 )。
    mainLayout - > addWidget(userNameLabel、20 ); 
    mainLayout - > addWidget(userNameLineEdit、21 )。
    mainLayout - > addWidget(serverIPLabel、30 ); 
    mainLayout - > addWidget(serverIPLineEdit、31 )。
    mainLayout- > addWidget(portLabel、40 ); 
    mainLayout - > addWidget(portLineEdit、4。 1。); 
    mainLayout - > addWidget(enterBtn、5012 ); 

    ステータス = 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())); 
    } 
}

 

おすすめ

転載: www.cnblogs.com/Emiya-Shirou/p/11279928.html