208 lines
5.3 KiB
C++
208 lines
5.3 KiB
C++
#include <iostream>
|
||
#include <thread>
|
||
#include <chrono>
|
||
#include <atomic>
|
||
#include <string>
|
||
#include <vector>
|
||
|
||
// 包含TCPServer头文件
|
||
#include "IYTCPServer.h"
|
||
|
||
class TCPServerTest
|
||
{
|
||
private:
|
||
IYTCPServer* m_pServer;
|
||
std::atomic<bool> m_bRunning;
|
||
int m_nPort;
|
||
std::thread m_sendThread;
|
||
|
||
public:
|
||
/**
|
||
* @brief 构造函数
|
||
* @param port 服务器监听端口
|
||
*/
|
||
TCPServerTest(int port) : m_pServer(nullptr), m_bRunning(false), m_nPort(port)
|
||
{
|
||
// 创建TCPServer实例
|
||
if (!VrCreatYTCPServer(&m_pServer)) {
|
||
std::cerr << "Failed to create TCPServer instance" << std::endl;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 析构函数
|
||
*/
|
||
~TCPServerTest()
|
||
{
|
||
Stop();
|
||
if (m_pServer) {
|
||
m_pServer->Close();
|
||
delete m_pServer;
|
||
m_pServer = nullptr;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 初始化服务器
|
||
* @return true表示成功,false表示失败
|
||
*/
|
||
bool Initialize()
|
||
{
|
||
if (!m_pServer) {
|
||
return false;
|
||
}
|
||
|
||
// 初始化socket
|
||
if (!m_pServer->Init(m_nPort, false)) {
|
||
std::cerr << "Failed to initialize server socket" << std::endl;
|
||
return false;
|
||
}
|
||
|
||
// 设置事件回调
|
||
m_pServer->SetEventCallback([this](const TCPClient* pClient, TCPServerEventType eventType) {
|
||
this->OnServerEvent(pClient, eventType);
|
||
});
|
||
|
||
// 启动服务器线程
|
||
if (!m_pServer->Start([this](const TCPClient* pClient, const char* pData, const unsigned int nLen) {
|
||
this->OnDataReceived(pClient, pData, nLen);
|
||
}, false)) {
|
||
std::cerr << "Failed to start server" << std::endl;
|
||
return false;
|
||
}
|
||
|
||
std::cout << "Server initialized successfully on port " << m_nPort << std::endl;
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* @brief 启动数据发送线程
|
||
* @return true表示成功,false表示失败
|
||
*/
|
||
bool Start()
|
||
{
|
||
if (!m_pServer) {
|
||
return false;
|
||
}
|
||
|
||
m_bRunning = true;
|
||
m_sendThread = std::thread(&TCPServerTest::SendDataLoop, this);
|
||
std::cout << "Server started, sending data to clients..." << std::endl;
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* @brief 停止服务器
|
||
*/
|
||
void Stop()
|
||
{
|
||
m_bRunning = false;
|
||
|
||
if (m_sendThread.joinable()) {
|
||
m_sendThread.join();
|
||
}
|
||
|
||
if (m_pServer) {
|
||
m_pServer->Stop();
|
||
}
|
||
|
||
std::cout << "Server stopped" << std::endl;
|
||
}
|
||
|
||
private:
|
||
/**
|
||
* @brief 服务器事件回调函数
|
||
* @param pClient 客户端指针
|
||
* @param eventType 事件类型
|
||
*/
|
||
void OnServerEvent(const TCPClient* pClient, TCPServerEventType eventType)
|
||
{
|
||
switch (eventType) {
|
||
case TCP_EVENT_CLIENT_CONNECTED:
|
||
std::cout << "Client connected" << std::endl;
|
||
break;
|
||
case TCP_EVENT_CLIENT_DISCONNECTED:
|
||
std::cout << "Client disconnected" << std::endl;
|
||
break;
|
||
case TCP_EVENT_CLIENT_EXCEPTION:
|
||
std::cout << "Client exception" << std::endl;
|
||
break;
|
||
default:
|
||
std::cout << "Unknown event" << std::endl;
|
||
break;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 数据接收回调函数
|
||
* @param pClient 客户端指针
|
||
* @param pData 数据指针
|
||
* @param nLen 数据长度
|
||
*/
|
||
void OnDataReceived(const TCPClient* pClient, const char* pData, const unsigned int nLen)
|
||
{
|
||
// 服务器测试程序只需要发送数据,不需要处理接收的数据
|
||
std::cout << "Received " << nLen << " bytes from client" << std::endl;
|
||
}
|
||
|
||
/**
|
||
* @brief 持续发送数据的循环
|
||
*/
|
||
void SendDataLoop()
|
||
{
|
||
int counter = 0;
|
||
char pData[1024];
|
||
while (m_bRunning) {
|
||
// 构造要发送的数据
|
||
*(int *)(pData) = ++counter;
|
||
|
||
// 发送给所有连接的客户端
|
||
if (m_pServer) {
|
||
m_pServer->SendAllData(pData, sizeof(pData));
|
||
}
|
||
|
||
// 每秒发送一次
|
||
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||
}
|
||
}
|
||
};
|
||
|
||
int main(int argc, char* argv[])
|
||
{
|
||
std::cout << "TCP Server Test Program" << std::endl;
|
||
std::cout << "=======================" << std::endl;
|
||
|
||
// 默认端口为8080
|
||
int port = 8080;
|
||
if (argc > 1) {
|
||
port = std::stoi(argv[1]);
|
||
}
|
||
|
||
TCPServerTest serverTest(port);
|
||
|
||
// 初始化服务器
|
||
if (!serverTest.Initialize()) {
|
||
std::cerr << "Failed to initialize server" << std::endl;
|
||
return -1;
|
||
}
|
||
|
||
// 启动服务器
|
||
if (!serverTest.Start()) {
|
||
std::cerr << "Failed to start server" << std::endl;
|
||
return -1;
|
||
}
|
||
|
||
// 等待用户输入以停止服务器
|
||
std::cout << "Server is running. Press Enter to stop..." << std::endl;
|
||
while(true){
|
||
std::cin.get();
|
||
std::this_thread::sleep_for(std::chrono::seconds(10));
|
||
}
|
||
|
||
// 停止服务器
|
||
serverTest.Stop();
|
||
|
||
std::cout << "TCP Server Test completed!" << std::endl;
|
||
return 0;
|
||
}
|