独立完成基于TCP协议的Socket 通信客户和服务器端程序,两端进程可以交互异步方式发送和接收数据(接收和发送消息的工作由线程完成)。客户和服务器端可以将各自收发的数据保存至文件中。 利用c++语言
时间: 2024-12-13 11:26:48 浏览: 19
在C++中,要创建一个基于TCP协议的Socket通信的客户端和服务器端程序,你可以按照以下步骤操作:
**服务器端程序(server.cpp):**
```cpp
#include <iostream>
#include <string>
#include <boost/asio.hpp> // 使用Boost.Asio库处理网络编程
class Server {
public:
void start(int port) {
boost::asio::io_service io_service;
tcp_server server(io_service, port);
server.start();
}
private:
class tcp_server : public boost::asio::ip::tcp::acceptor {
public:
tcp_server(boost::asio::io_service& io_service, int port)
: acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)),
socket(io_service) {}
void start() {
do_accept();
}
private:
void do_accept() {
accept(socket);
new_connection(socket);
}
void new_connection(boost::asio::ip::tcp::socket& sock) {
std::thread worker(new thread_handler(sock));
workers_.push_back(worker);
}
void thread_handler(boost::asio::ip::tcp::socket& socket) {
std::string message = "Connection established!";
boost::system::error_code ignored_error;
write(socket, boost::asio::buffer(message), ignored_error);
read_message(socket); // 异步读取客户端消息
}
// 添加读取客户端消息的函数
template<typename Streambuf>
void read_message(Streambuf& sb) {
boost::asio::async_read_until(
socket,
sb,
"\r\n", // 消息结束符
[this, &sb](auto error, auto /* bytes_transferred */) mutable {
if (!error) {
process_message(sb.str());
read_message(sb);
} else {
close_socket(sb);
}
});
}
void process_message(const std::string& message) {
// 文件操作,例如保存到文件
save_to_file(message);
}
void close_socket(Streambuf&) {
socket.close();
}
std::list<std::thread> workers_;
boost::asio::ip::tcp::socket socket;
};
};
// ... 其他辅助函数如保存到文件的实现 ...
int main() {
Server server;
server.start(12345); // 使用12345作为端口
return 0;
}
```
**客户端程序(client.cpp):**
```cpp
#include <iostream>
#include <string>
#include <boost/asio.hpp>
void send_data(const std::string& message, const boost::asio::ip::tcp::resolver& resolver, boost::asio::ip::tcp::socket& socket) {
boost::asio::write(socket, boost::asio::buffer(message + "\r\n"));
}
int main() {
try {
boost::asio::io_service io_service;
// 解析服务器地址
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query("localhost", "12345");
boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
// 连接到服务器
boost::asio::ip::tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
// 发送数据
std::string message = "Hello from client";
send_data(message, resolver, socket);
// 从服务器读取响应
std::string response;
boost::asio::streambuf receive_buffer;
boost::asio::async_read_until(socket, receive_buffer, "\r\n",
[response = receive_buffer.str()](const boost::system::error_code& error, size_t transferred) {
if (error || transferred == 0) {
std::cerr << "Failed to read response" << std::endl;
} else {
std::cout << "Response: " << response << std::endl;
}
io_service.stop(); // 关闭服务
});
io_service.run(); // 开始IO服务,等待读取完成
}
catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
return 0;
}
```
阅读全文
相关推荐


















