Преглед изворни кода

#223: WebSocketClient::WebSocketClient(EventLoopPtr loop = NULL)

ithewei пре 3 година
родитељ
комит
040638cbc4

+ 12 - 7
evpp/TcpClientEventLoop_test.cpp

@@ -15,9 +15,9 @@
 
 using namespace hv;
 
-class MyTcpClient : public TcpClientEventLoopTmpl<SocketChannel> {
+class MyTcpClient : public TcpClient {
 public:
-    MyTcpClient(EventLoopPtr loop = NULL) : TcpClientEventLoopTmpl<SocketChannel>(loop) {
+    MyTcpClient(EventLoopPtr loop = NULL) : TcpClient(loop) {
         onConnection = [this](const SocketChannelPtr& channel) {
             std::string peeraddr = channel->peeraddr();
             if (channel->isConnected()) {
@@ -67,7 +67,8 @@ public:
         withTLS();
 #endif
         printf("client connect to port %d, connfd=%d ...\n", port, connfd);
-        return startConnect();
+        start();
+        return connfd;
     }
 };
 typedef std::shared_ptr<MyTcpClient> MyTcpClientPtr;
@@ -79,15 +80,19 @@ int main(int argc, char* argv[]) {
     }
     int port = atoi(argv[1]);
 
-    EventLoopPtr loop(new EventLoop);
+    EventLoopThreadPtr loop_thread(new EventLoopThread);
+    loop_thread->start();
 
-    MyTcpClientPtr cli1(new MyTcpClient(loop));
+    MyTcpClientPtr cli1(new MyTcpClient(loop_thread->loop()));
     cli1->connect(port);
 
-    MyTcpClientPtr cli2(new MyTcpClient(loop));
+    MyTcpClientPtr cli2(new MyTcpClient(loop_thread->loop()));
     cli2->connect(port);
 
-    loop->run();
+    // press Enter to stop
+    while (getchar() != '\n');
+    loop_thread->stop();
+    loop_thread->join();
 
     return 0;
 }

+ 8 - 3
examples/websocket_client_test.cpp

@@ -45,12 +45,17 @@ int main(int argc, char** argv) {
 
     std::string str;
     while (std::getline(std::cin, str)) {
-        if (!ws.isConnected()) break;
-        if (str == "quit") {
+        if (str == "close") {
             ws.close();
+        } else if (str == "open") {
+            ws.open(url, headers);
+        } else if (str == "stop") {
+            ws.stop();
             break;
+        } else {
+            if (!ws.isConnected()) break;
+            ws.send(str);
         }
-        ws.send(str);
     }
 
     return 0;

+ 5 - 6
http/client/WebSocketClient.cpp

@@ -7,8 +7,8 @@
 
 namespace hv {
 
-WebSocketClient::WebSocketClient()
-    : TcpClientTmpl<WebSocketChannel>()
+WebSocketClient::WebSocketClient(EventLoopPtr loop)
+    : TcpClientTmpl<WebSocketChannel>(loop)
 {
     state = WS_CLOSED;
     ping_interval = DEFAULT_WS_PING_INTERVAL;
@@ -16,7 +16,7 @@ WebSocketClient::WebSocketClient()
 }
 
 WebSocketClient::~WebSocketClient() {
-    close();
+    stop();
 }
 
 /*
@@ -45,6 +45,7 @@ int WebSocketClient::open(const char* _url, const http_headers& headers) {
 
     int connfd = createsocket(http_req_->port, http_req_->host.c_str());
     if (connfd < 0) {
+        hloge("createsocket %s:%d return %d!", http_req_->host.c_str(), http_req_->port, connfd);
         return connfd;
     }
 
@@ -181,9 +182,7 @@ int WebSocketClient::open(const char* _url, const http_headers& headers) {
 }
 
 int WebSocketClient::close() {
-    if (channel == NULL) return -1;
-    channel->close();
-    stop();
+    closesocket();
     state = WS_CLOSED;
     return 0;
 }

+ 1 - 1
http/client/WebSocketClient.h

@@ -24,7 +24,7 @@ public:
     // PATCH: onmessage not given opcode
     enum ws_opcode opcode() { return channel ? channel->opcode : WS_OPCODE_CLOSE; }
 
-    WebSocketClient();
+    WebSocketClient(EventLoopPtr loop = NULL);
     ~WebSocketClient();
 
     // url = ws://ip:port/path