更新:当它们位于同一主机上时,我可以在本地运行服务器和客户端完善版。以下情况是它们在不同的计算机上时的情况(更具体地说,一台计算机在ARM64 Petalinux上运行,另一台在Ubuntu上运行)。也许我需要在服务器端等设置一些选项
我有一个Poco Websocket服务器,该服务器是在Poco和javascript客户端提供的标准样本上编写的。尝试打开websocket时,有时尝试2-3次后,它会在第一次使用时就连接起来,依此类推。现在,一旦连接,它可能会发送消息或只是在客户端断开连接。虽然在服务器端没有错误,但我可以肯定它仍然是打开的,因为当我尝试从客户端打开另一个连接时,它将在不同的客户端端口上建立连接。
现在有趣的是,我编写了一个Poco websocket客户端,并在循环中无延迟地连续发送/接收消息,客户端保持活动状态一段时间,然后服务器和客户端都说对等方重置了异常连接。接下来,当我在客户端发送/接收消息时(例如5s)在循环中延迟时,客户端将发送/接收3-4次,然后客户端遇到由对等方重置的异常连接,现在这次没有此类消息在服务器端。这真让我感到困惑,因为无论我尝试什么,我都找不到解决方案。 PS:我的Websocket服务器有10天的超时时间
服务器端请求处理如下:
std::cout << "Request Received" << std::endl;
Poco::Util::Application& app = Poco::Util::Application::instance();
try
{
std::cout << "Trying to connect..." << std::endl;
Poco::Net::WebSocket ws(request, response);
ws.setReceiveTimeout(Poco::Timespan(10, 0, 0, 0, 0)); //Timeout of 10 days
app.logger().information("WebSocket connection established!");
int flags, n;
do
{
char buffer[1024] = {'\0'};
std::cout << "Waiting for incoming frame" << std::endl;
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
strncpy(buffer, "Hello Client!!", 1024);
ws.sendFrame(buffer, strlen(buffer), Poco::Net::WebSocket::FRAME_TEXT);
}
while (n > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE);
std::cout << "Websocket Closed" << std::endl;
app.logger().information("WebSocket connection closed.");
}
catch (std::exception& e)
{
std::cout << "Exception " << e.what() << std::endl;
}
(正如人们所看到的,当websocket关闭时,服务器将发布一条消息,但是当客户端说对等方重置连接时,什么都不会显示)
poco websocket客户端是:
HTTPClientSession cs("IP", port);
HTTPRequest request(HTTPRequest::HTTP_GET, "/?encoding=text",HTTPMessage::HTTP_1_1);
request.set("origin", "http://localhost");
HTTPResponse response;
bool run = true;
try {
WebSocket* m_psock = new WebSocket(cs, request, response);
char buffer[1024] = {'\0'};
std::string str = "Hello Server!!";
do {
char receiveBuff[256];
strncpy(buffer, str.c_str(), 1024);
int len=m_psock->sendFrame(buffer,strlen(buffer),WebSocket::FRAME_TEXT);
std::cout << "Sent bytes " << len << std::endl;
std::cout << "Sent Message: " << buffer << std::endl;
int flags=0;
int rlen=m_psock->receiveFrame(receiveBuff,256,flags);
std::cout << "Received bytes " << rlen << std::endl;
std::cout << receiveBuff << std::endl;
//std::cin >> str;
sleep(5);
} while (1);
m_psock->close();
}
catch (std::exception &e)
{
std::cout << "Exception " << e.what();
}
仅供参考:我无法处理由对等方重置的连接,因为它会直接变为异常,而不会将收到的字节打印为0