C++写一个存档聊天系统
时间: 2023-11-14 21:29:08 浏览: 77
以下是一个简单的 C++ 存档聊天系统的代码示例,使用了 socket 编程和文件 I/O 实现:
```c++
#include <iostream>
#include <cstring>
#include <string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <thread>
#include <fstream>
#include <ctime>
using namespace std;
const int BUFFER_SIZE = 1024; // 缓冲区大小
// 保存聊天记录到文件
void save_to_file(string message) {
time_t now = time(nullptr);
char time_str[20];
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", localtime(&now)); // 格式化时间戳
string filename = "chat_" + string(time_str) + ".txt"; // 根据时间戳生成文件名
ofstream outfile(filename, ios::out | ios::app);
outfile << message << endl; // 写入消息到文件
outfile.close();
}
// 接收消息
void receive(int sock) {
char buffer[BUFFER_SIZE];
while (true) {
memset(buffer, 0, BUFFER_SIZE); // 清空缓冲区
int ret = recv(sock, buffer, BUFFER_SIZE, 0);
if (ret == -1) { // 接收失败
cout << "接收消息失败!" << endl;
break;
}
if (ret == 0) { // 对方关闭了连接
cout << "连接已关闭!" << endl;
break;
}
cout << "收到消息:" << buffer << endl;
save_to_file(buffer); // 保存消息到文件
}
}
int main() {
int server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字
if (server_sock == -1) {
cout << "创建套接字失败!" << endl;
return -1;
}
sockaddr_in server_addr{}; // 服务器地址
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888); // 端口号
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意地址
// 绑定套接字和地址
int ret = bind(server_sock, (sockaddr*)&server_addr, sizeof(server_addr));
if (ret == -1) {
cout << "绑定套接字失败!" << endl;
return -1;
}
// 监听连接请求
ret = listen(server_sock, 5);
if (ret == -1) {
cout << "监听连接请求失败!" << endl;
return -1;
}
sockaddr_in client_addr{}; // 客户端地址
socklen_t client_addr_len = sizeof(client_addr);
// 接受连接请求
int client_sock = accept(server_sock, (sockaddr*)&client_addr, &client_addr_len);
if (client_sock == -1) {
cout << "接受连接请求失败!" << endl;
return -1;
}
char buffer[BUFFER_SIZE];
thread t(receive, client_sock); // 开启一个线程用于接收消息
t.detach(); // 分离线程
while (true) {
memset(buffer, 0, BUFFER_SIZE); // 清空缓冲区
cout << "请输入消息:";
cin.getline(buffer, BUFFER_SIZE);
if (strcmp(buffer, "exit") == 0) { // 用户输入 exit 退出程序
break;
}
ret = send(client_sock, buffer, strlen(buffer), 0);
if (ret == -1) { // 发送失败
cout << "发送消息失败!" << endl;
break;
}
save_to_file(buffer); // 保存消息到文件
}
close(client_sock); // 关闭套接字
close(server_sock);
return 0;
}
```
该程序在 `save_to_file` 函数中使用了文件 I/O 将聊天记录保存到文件中。每次收到消息时,都会将消息保存到以当前时间戳命名的文件中。
需要注意的是,该代码只是一个简单的示例,实际的存档聊天系统需要考虑更多的安全性和用户体验等因素。
阅读全文