TCP에게 TCP 클라이언트를 사용하여 채팅방 QT5 (b)에 서면 프로토콜의 준비를 사용하는 방법

머리말

서버 측 클라이언트 측의 경우, 두 가지 기능으로 구분되어 서버 측에서 (서버 측 내 이전 텍스트를 볼 수 있습니다) 상대적으로 간단하다 : 1. 서버 소켓 서버 2. 송신 데이터에 대한 연결을 설정 워드

실현

1. 서버 측에 대한 연결을 수립

먼저 연결을 설정하는 누구와 알고있다, 그래서 우리는 우리가 사용하는 IP 주소를 입력 여부를 테스트 한 다음 대상과의 연결을 설정하기 위해 QTcpSocket connectToHost () 함수를 사용하여 객체를 사용하는 QHostAddress 대상 객체가 필요, 함수는 두 받아 매개 변수는 첫 번째 매개 변수는 두 번째 매개 변수는 기능을 사용할 때 포트가., 서버는 우리의 접근을들을 수있을 것입니다, IP 주소입니다.

서버에 데이터를 전송하는 2 소켓

변수가이 동작은, wirte () 함수는 객체 마찬가지로 QTcpSocket 의해 호출되는 구현 될 수있는 판독 데이터 wirte () 함수의 역수이고, 함수는 두 개의 매개 변수를 받아, 최초의 파라미터가 저장된 데이터는 그렇게 송신 그래서, 두 번째 매개 변수는 전송 된 바이트의 수이다.

특정 코드

에러 정정 이해를 제공하고자하는 경우가 코드, 코드 기준 << Qt5 개발 및 실시 예 (제 3 판) >>의 .CPP 부분에 다음 코드

하여 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 ,, 01 , 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 ), 

    상태 = 거짓 ; // 상태는 현재 상태를 나타낸다 대화방을 체결했다고 참, 거짓은 IM 나타냅니다 둡니다 
    포트 = 8010 ; // 서버에 포트가 일치 
    portLineEdit-> 하며의 setText (QString :: 번호 (포트)) 
    serverip로 = 새로운 새로운 QHostAddress (); //이 를 초기화 QHostaddress 객체
    연결 (enterBtn, 신호는 (클릭 ()) 은이는 슬롯 (slotEnter ())); 
    연결 (sendBtn, 신호는 (()), 클릭 은이 , 슬롯 (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, 신호 (접속 ()), 연결 은이 슬롯 (slotConnected ())); // 후 () 신호 접속 성공적인 접속 
        연결 (TCPsocket, 분리 신호 (()) 은이 슬롯 (slotDisconnected () )); // 경우 () 신호 연결이 끊어 분리 
        (TCPsocket, 신호합니다 (readyRead (연결)) 은이 슬롯 (DateReceived 제 ())); // 콘텐츠 서버 정보를 반환 할 때 텍스트 상자를 업데이트 
        TCPsocket을 ->는 connectToHost (* serverip로, 포트); // 대상 IP, 접속 포트 구축 
        상태 = true로를 ; 
    } 
    다른 사람을 {
         INT의 길이는 = 0 ; 
        QString MSG는 사용자 이름 + TR을 (= ": 채팅방을 남겨주세요 " );
         IF ((길이 = tcpSocket-> 쓰기 (msg.toLatin1 (), msg.length ())) = msg.length을 ())! // 휴가 대화방 서버를 문자열로 
        {
             반환 ; 
        } 
        TCPsocket -> disconnectFromHost은 (); // 소켓 닫으려고 
        = 상태를 false로 ; 
    } 
} 
무효 )합니다 (하여 TcpClient :: slotConnected을 // 연결에 성공 후 신호를 받아 전송에 문자열 "대화방 입력" 서버 
{ 
    sendBtn -> (는, setEnabled true로 ) 
    enterBtn ->을의 setText (TR은 ( " 남겨 " ));
    INT의 길이 = 0 ; 
    QString MSG는 사용자 이름 + TR (= " 객실 채팅 입력 " );
     IF (! (길이 = tcpSocket-> 쓰기 (msg.toLatin1 (), msg.length ())) =를 msg.length ()) 
    { 
        반환 ; 
    } 
} 
무효 하여 TcpClient :: slotSend을 () // 텍스트 상자를 읽고 전송 키를 누르면 서버에 콘텐츠를 전송 
{
     만약에 (sendLineEdit-> 텍스트 () == "" ) 
    { 
        반환 ; 
    } 
    QString MSG = 사용자 이름 + " : " + 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