当前位置: 首页 > 工具软件 > Ascs > 使用案例 >

ascs 简明开发教程(三):多连接管理(客户端)

史骏
2023-12-01

QQ交流群:198941541

为了让客户端支持任意条数的连接,我们需要修改一下ascs 简明开发教程(1)里面的代码,用multi_client代替single_client,如下:

#include <iostream>

#include <ascs/ext/tcp.h>
using namespace ascs;
using namespace ascs::tcp;
using namespace ascs::ext;
using namespace ascs::ext::tcp;

#define QUIT_COMMAND	"quit"

int main()
{
	service_pump sp;
	server s(sp);
	multi_client c(sp);

	c.add_socket(); //link #1
	c.add_socket(ASCS_SERVER_PORT, ASCS_SERVER_IP); //link #2

	sp.start_service();
	while (sp.is_running())
	{
		std::string str;
		std::getline(std::cin, str);
		if (str.empty())
			;
		else if (QUIT_COMMAND == str)
			sp.stop_service();
		else
		{
			c.broadcast_msg(str + " (from client)");
			s.broadcast_msg(str + " (from server)");
		}
	}
}

如你所见,你需要多少条连接,就调用多少次add_socket即可,同一个multi_client管理的连接,可以连接不同的服务器。运行结果如下(其中的abc由键盘输入):

[4120] Fri Mar 20 21:46:19 2020 -> service pump started.
[4120] Fri Mar 20 21:46:19 2020 -> begin to pre-create 16 server socket...
[4120] Fri Mar 20 21:46:19 2020 -> finished pre-creating server sockets.
[15440] Fri Mar 20 21:46:19 2020 -> 1 connecting success.
[3148] Fri Mar 20 21:46:19 2020 -> 15 client: (127.0.0.1:5050 127.0.0.1:55232) arrive.
[14524] Fri Mar 20 21:46:19 2020 -> 0 connecting success.
[11812] Fri Mar 20 21:46:19 2020 -> 14 client: (127.0.0.1:5050 127.0.0.1:55231) arrive.
abc
[3148] Fri Mar 20 21:46:27 2020 -> 0 recv(17): abc (from server)
[14696] Fri Mar 20 21:46:27 2020 -> 14 recv(17): abc (from client)
[1544] Fri Mar 20 21:46:27 2020 -> 1 recv(17): abc (from server)
[11812] Fri Mar 20 21:46:27 2020 -> 15 recv(17): abc (from client)

但是,如果我想在main函数里,指定从某一条连接(客户端)上给服务器发送数据,怎么办呢?我的建议是,用回single_client,然后用STL容器自己来管理连接,比如(用shared_ptr是因为asio的socket对象不能复制,而我的库直接用了asio的socket对象):

#include <iostream>

#include <ascs/ext/tcp.h>
using namespace ascs;
using namespace ascs::tcp;
using namespace ascs::ext;
using namespace ascs::ext::tcp;

#define QUIT_COMMAND	"quit"

int main()
{
	service_pump sp;
	server s(sp);
	std::unordered_map<int, std::shared_ptr<single_client>> c;
	c[0] = std::make_shared<single_client>(sp); //link #1
	auto client_ptr = std::make_shared<single_client>(sp);
	client_ptr->set_server_addr(ASCS_SERVER_PORT, ASCS_SERVER_IP);
	c[1] = client_ptr; //link #2

	sp.start_service();
	while (sp.is_running())
	{
		std::string str;
		std::getline(std::cin, str);
		if (str.empty())
			;
		else if (QUIT_COMMAND == str)
			sp.stop_service();
		else
		{
			c[0]->send_msg(str + " (from client)");
			s.broadcast_msg(str + " (from server)");
		}
	}
}

运行结果如下(其中的abc由键盘输入):

[14244] Fri Mar 20 22:10:50 2020 -> service pump started.
[14244] Fri Mar 20 22:10:50 2020 -> begin to pre-create 16 server socket...
[14244] Fri Mar 20 22:10:50 2020 -> finished pre-creating server sockets.
[14508] Fri Mar 20 22:10:50 2020 -> -1 connecting success.
[6420] Fri Mar 20 22:10:50 2020 -> 15 client: (127.0.0.1:5050 127.0.0.1:55728) arrive.
[13092] Fri Mar 20 22:10:50 2020 -> -1 connecting success.
[12264] Fri Mar 20 22:10:50 2020 -> 14 client: (127.0.0.1:5050 127.0.0.1:55729) arrive.
abc
[13092] Fri Mar 20 22:10:53 2020 -> -1 recv(17): abc (from server)
[11748] Fri Mar 20 22:10:53 2020 -> 15 recv(17): abc (from client)
[12264] Fri Mar 20 22:10:53 2020 -> -1 recv(17): abc (from server)

那么multi_client似乎作用不大,其实它的存在还是有作用的,这个问题我们留到讲服务器的连接管理时再说,到时会有另一种连接管理的介绍,敬请期待。

如果我想动态的增减连接呢(start_service之后)?这个问题我们留到讲service_pump和容器类的时候再说,敬请期待。

上一篇:ascs 简明开发教程(2)下一篇:ascs 简明开发教程(4)

 类似资料: