C++实现聊天程序攻略
1. 确定通信协议
在实现聊天程序之前,需要确定通信协议。常见的通信协议包括TCP、UDP等,这里我们选择TCP协议。
TCP协议是一种面向连接的协议,它提供可靠的数据传输,适用于需要确保数据完整性的场景,如聊天程序。
2. 编写服务器端和客户端程序
2.1 服务器端程序
服务器端程序需要完成以下任务:
- 创建一个socket对象,指定协议为TCP;
- 绑定端口号;
- 监听连接请求;
- 接受连接请求,创建一个新的socket对象与客户端进行通信;
- 接收客户端发送的消息;
- 将消息发送给其他客户端。
以下是一个简单的服务器端程序示例:
#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;
const int PORT = 8888; // 服务器端口号
const int MAXCONN = 10; // 最大连接数
void* handle_client(void* arg) {
int client_sock = *(int*)arg;
char buffer[1024] = {0};
while (true) {
int len = read(client_sock, buffer, sizeof(buffer));
if (len == 0) break;
cout << "收到客户端消息: " << buffer << endl;
memset(buffer, 0, sizeof(buffer));
}
close(client_sock);
return NULL;
}
int main() {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
pthread_t thread_id;
// 创建socket对象
if ((server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
cout << "创建socket对象失败" << endl;
return -1;
}
// 绑定端口号
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
cout << "绑定端口号失败" << endl;
return -1;
}
// 监听连接请求
if (listen(server_sock, MAXCONN) < 0) {
cout << "监听连接请求失败" << endl;
return -1;
}
while (true) {
socklen_t client_len = sizeof(client_addr);
// 接受连接请求,创建新的socket对象
if ((client_sock = accept(server_sock, (struct sockaddr*)&client_addr, &client_len)) < 0) {
cout << "接受连接请求失败" << endl;
continue;
}
cout << "客户端连接成功,IP地址为:" << inet_ntoa(client_addr.sin_addr) << endl;
// 创建新线程处理客户端消息
if (pthread_create(&thread_id, NULL, handle_client, (void*)&client_sock) < 0) {
cout << "创建线程失败" << endl;
return -1;
}
}
close(server_sock);
return 0;
}
2.2 客户端程序
客户端程序需要完成以下任务:
- 创建一个socket对象,指定协议为TCP;
- 连接服务器端;
- 发送消息给服务器端;
- 接收服务器端发送的消息。
以下是一个简单的客户端程序示例:
#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
const char* SERVER_IP = "127.0.0.1"; // 服务器IP地址
const int PORT = 8888; // 服务器端口号
int main() {
int client_sock;
struct sockaddr_in server_addr;
// 创建socket对象
if ((client_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
cout << "创建socket对象失败" << endl;
return -1;
}
// 连接服务器端
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(PORT);
if (connect(client_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
cout << "连接服务器端失败" << endl;
return -1;
}
// 发送消息给服务器端
string message;
while (getline(cin, message)) {
send(client_sock, message.c_str(), message.size(), 0);
if (message == "quit") break;
}
close(client_sock);
return 0;
}
3. 示例说明
3.1 示例1
此示例展示了如何在服务器端接收客户端发来的消息,并将消息打印到终端上。
启动服务器端程序后,在终端输入以下命令:
$ nc 127.0.0.1 8888
此时,nc命令会连接服务器端。在终端输入消息,服务器端会接收到并在终端上打印该消息。
3.2 示例2
此示例展示了如何在客户端向服务器端发送消息,并在服务器端接收到该消息后,将消息发送给其他客户端。
启动服务器端程序后,在终端输入以下命令:
$ nc 127.0.0.1 8888
此时,nc命令会连接服务器端。分别打开两个终端,分别输入以下命令:
$ ./client.out
这时,在一个终端中输入消息,消息会被发送给服务器端,服务器端会将该消息发送给其他客户端,并在每个客户端上打印该消息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现聊天程序 - Python技术站