머리말
서버 측 클라이언트 측의 경우, 두 가지 기능으로 구분되어 서버 측에서 (서버 측 내 이전 텍스트를 볼 수 있습니다) 상대적으로 간단하다 : 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 ())); } }