QT版本:5.15.2
VS版本:2019
客户端程序主要包含三块:连接服务器,发送消息,关闭客户端
服务端程序主要包含三块:打开消息监听,接收消息并反馈,关闭服务端
1、先打开服务端监听功能
void TCPServer::listen() { initWsaData(); //创建套接字 sock = socket(AF_INET, SOCK_STREAM, 0); //创建地址簇对象 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(9888); sin.sin_addr.s_addr = htonl(INADDR_ANY); //绑定套接字 int bindStatus = ::bind(sock, (struct sockaddr*)&sin, sizeof(sin)); if (bindStatus == -1) { qDebug() << "socket bind failed!" << endl; ui.textBrowser->setText("socket bind failed!"); return; } else { qDebug() << "socket bind success!" << endl; ui.textBrowser->setText("socket bind success!"); } //将套接字设为监听模式,等待客户端连接 int listenStatus = ::listen(sock, 128); if (listenStatus == -1) { qDebug() << "listen failed" << endl; ui.textBrowser->setText("listen failed"); return; } else { qDebug() << "set listen success, server is listening..." << endl; ui.textBrowser->setText("set listen success, server is listening..."); } //收到请求主后,接收连接请求,返回一个对应此次连接的新套接字 //接受连接请求 sockaddr_in sinAccept; int len = sizeof(sin); newSock = accept(sock, (struct sockaddr*)&sinAccept, &len); if (newSock == SOCKET_ERROR) { qDebug() << "connect failed" << endl; ui.textBrowser->setText("connect failed"); return; } else { qDebug() << "connect success, ready to recv data" << endl; ui.textBrowser->setText("connect success, ready to recv data"); } }
2、点击客户端connect连接服务端
void TCPClient::Connect(const std::string ip, const int port) { bool res = initWsaData(); //初始化套接字库 if (!res) return; //常用协议族:AF_UNIX(本机通信)AF_INET(TCP/IP – IPv4)AF_INET6(TCP/IP – IPv6) //套接字类型:SOCK_STREAM(TCP流)SOCK_DGRAM(UDP数据报)SOCK_RAW(原始套接字) //protocol”一般设置为“0” sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == SOCKET_ERROR) { qDebug() << "Failed to create socket" << endl; ui.textBrowser->setText("Failed to create socket"); return; } else { qDebug() << "Socket created successfully" << endl; ui.textBrowser->setText("Socket created successfully"); } //设置地址 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = inet_addr(ip.c_str()); //连接服务器 int connStatus = ::connect(sock, (struct sockaddr*)&sin, sizeof(sin)); if (connStatus == -1) { qDebug() << "Failed to connect to the server" << endl; ui.textBrowser->setText("Failed to connect to the server"); return; } }
3、在客户端输入消息点击send发送到服务端
void TCPClient::DataTransmission() { string msg = ui.lineEdit->text().toStdString(); /*char sendBuf[MAX_MSG_SIZE]; memset(sendBuf, 0, MAX_MSG_SIZE)*/; int sendStatus = send(sock, msg.c_str(), MAX_MSG_SIZE, 0); if (sendStatus == 0) { qDebug() << "Failed to send information" << endl; ui.textBrowser->setText("Failed to send information"); //关闭套接字及套接字库 closesocket(sock); WSACleanup(); return; } char recvBuf[MAX_MSG_SIZE]; memset(recvBuf, 0, MAX_MSG_SIZE); int recvStatus = recv(sock, recvBuf, MAX_MSG_SIZE, 0); if (recvStatus == -1) { qDebug() << "Failed to receive message" << endl; ui.textBrowser->setText("Failed to receive message"); //关闭套接字及套接字库 /* closesocket(sock); WSACleanup();*/ return; } else { qDebug() << "Server information:" << recvBuf << endl; string msg = "---------Server information:" + string(recvBuf); ui.textBrowser->setText(QString::fromStdString(msg)); } }
4、在服务端点击send接收客户端消息并通知客户端已收到消息
void TCPServer::DataTransmission() { //用新建立的套接字和客户端进行通信 char recvBuf[MAX_MSG_SIZE]; char sendBuf[MAX_MSG_SIZE]; memset(recvBuf, 0, MAX_MSG_SIZE); memset(sendBuf, 0, MAX_MSG_SIZE); if (true) { int recvStatus = recv(newSock, recvBuf, MAX_MSG_SIZE, 0); if (recvStatus == -1) { qDebug() << "recv data failed" << endl; ui.textBrowser->setText("recv data failed"); closesocket(sock); closesocket(newSock); WSACleanup(); return; } else { qDebug() << "recv client new msg:" << recvBuf << endl; string msg = "--------------recv client new msg:" + string(recvBuf); ui.textBrowser->setText(QString::fromStdString(msg)); } /*qDebug() << "请输入回复消息:"; cin >> sendBuf;*/ string sendMsg = "has recv msg-------"; int sendStatus = send(newSock, sendMsg.c_str(), sizeof(sendBuf), 0); if (sendStatus == -1) { qDebug() << "msg send failed" << endl; ui.textBrowser->setText("msg send failed"); closesocket(sock); closesocket(newSock); WSACleanup(); return; } } }
=====================