Przeglądaj źródła

客户端还是有问题

zhangyang 6 lat temu
rodzic
commit
e4b65a40ff

BIN
bin/Win32/Debug/zhipuzi_pos_windows/zhipuzi_pos_windows.exe


+ 5 - 1
lewaimai_dispatch/lewaimai_dispatch_windows.cpp

@@ -17,7 +17,11 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
     CConfigReader::ReadConfigFile();
 
 	//由这个对象来处理消息推送
-	CMessagePush push;
+	boost::asio::io_context io_context;
+	CMessagePush push(io_context);
+
+	std::thread t(&CMessagePush::Start, &push);
+	t.detach();
 
 	//开始展示窗口
     CPaintManagerUI::SetInstance(hInstance);

+ 74 - 46
lewaimai_dispatch/network/CMessagePush.cpp

@@ -3,32 +3,23 @@
 
 #include "../tool/CPosPrinter.h"
 
-CMessagePush::CMessagePush()
-{
-	std::thread t(&CMessagePush::Init, this);
-	t.detach();
-}
-
-
 CMessagePush::~CMessagePush()
 {
+	
 }
 
-void CMessagePush::Init()
+void CMessagePush::Start()
 {
 	try
 	{
-		boost::asio::io_context io_context;
-
 		char host[] = "192.168.3.29";
 		char port[] = "9001";
 
-		tcp::resolver resolver(io_context);
+		tcp::resolver resolver(m_io_context);
 		tcp::resolver::results_type endpoints =
 			resolver.resolve(tcp::v4(), host, port);
 
-		tcp::socket s(io_context);
-		boost::asio::connect(s, endpoints);
+		boost::asio::connect(socket_, endpoints);
 
 		//发送身份信息
 		rapidjson::Document doc;
@@ -44,35 +35,54 @@ void CMessagePush::Init()
 		//返回给接入层的消息
 		std::string m_login_msg = buffer.GetString();
 
-		boost::asio::write(s, boost::asio::buffer(m_login_msg, m_login_msg.length()));
+		//异步发送消息
+		PushMessage(m_login_msg);
 
-		char reply[max_length];
-		size_t reply_length = boost::asio::read(s,
-			boost::asio::buffer(reply, max_length));
+		//同时启动一个异步接受消息
+		socket_.async_read_some(boost::asio::buffer(data_, max_length),
+			boost::bind(&CMessagePush::handle_read, this,
+				boost::asio::placeholders::error,
+				boost::asio::placeholders::bytes_transferred));
+	}
+	catch (std::exception& e)
+	{
+		std::cerr << "Exception: " << e.what() << "\n";
+	}
 
-		//判断服务器返回的是不是ok,如果是的那么
-		string s_reply = reply;
+	CSystem::my_sleep(100);
+}
 
+void CMessagePush::PushMessage(std::string msg)
+{
+	boost::asio::async_write(socket_,
+		boost::asio::buffer(msg.c_str(), msg.length()),
+		boost::bind(&CMessagePush::handle_write, this,
+			boost::asio::placeholders::error));
+}
+
+void CMessagePush::HandleMessage(std::string msg)
+{
+	try
+	{
+		//收到服务器的消息,对服务器的消息进行处理
 		rapidjson::Document document;
-		document.Parse(s_reply.c_str());
+		document.Parse(msg.c_str());
 		if (!document.IsObject())
 		{
 			LOG_INFO("message 非法!");
 			return;
 		}
 
-		std::string status = document["status"].GetString();
+		int type = document["type"].GetInt();
+		std::string username = document["username"].GetString();
+		std::string order_id = document["order_id"].GetString();
+		std::string order_no = document["order_no"].GetString();
 
-		if (status == "ok")
+		if (type == 1)
 		{
-			//这个表示登录成功了
-			while (m_is_work)
-			{
-				ReceiveMessage(s);
-			}
+			CPosPrinter printer;
+			printer.PrintWaimaiOrder(order_id, order_no);
 		}
-
-		return;
 	}
 	catch (std::exception& e)
 	{
@@ -80,17 +90,13 @@ void CMessagePush::Init()
 	}
 }
 
-void CMessagePush::ReceiveMessage(tcp::socket& s)
+void CMessagePush::handle_read(const boost::system::error_code& error,
+	size_t bytes_transferred)
 {
-	try
+	if (!error)
 	{
-		char reply[max_length];
-		size_t reply_length = boost::asio::read(s,
-			boost::asio::buffer(reply, max_length));
+		string s_reply = data_;
 
-		string s_reply = reply;
-
-		//收到服务器的消息,对服务器的消息进行处理
 		rapidjson::Document document;
 		document.Parse(s_reply.c_str());
 		if (!document.IsObject())
@@ -99,19 +105,41 @@ void CMessagePush::ReceiveMessage(tcp::socket& s)
 			return;
 		}
 
-		std::string type = document["type"].GetString();
-		std::string username = document["username"].GetString();
-		std::string order_id = document["order_id"].GetString();
-		std::string order_no = document["order_no"].GetString();
+		int type = document["type"].GetInt();
+		if (type == 0)
+		{
+			std::string status = document["status"].GetString();
 
-		if (type == "1")
+			if (status == "ok")
+			{
+				//表示连接服务器成功了
+			}
+		}
+		else
 		{
-			CPosPrinter printer;
-			printer.PrintWaimaiOrder(order_id, order_no);
+			HandleMessage(s_reply);
 		}
+
+		memset(data_, 0, max_length);
+		socket_.async_read_some(boost::asio::buffer(data_, max_length),
+			boost::bind(&CMessagePush::handle_read, this,
+				boost::asio::placeholders::error,
+				boost::asio::placeholders::bytes_transferred));
 	}
-	catch (std::exception& e)
+	else
 	{
-		std::cerr << "Exception: " << e.what() << "\n";
+		delete this;
+	}
+}
+
+void CMessagePush::handle_write(const boost::system::error_code& error)
+{
+	if (!error)
+	{
+		LOG_INFO("send success!");
+	}
+	else
+	{
+		delete this;
 	}
 }

+ 20 - 4
lewaimai_dispatch/network/CMessagePush.h

@@ -17,22 +17,38 @@ public:
 class CMessagePush
 {
 public:
-	CMessagePush();
+	CMessagePush(boost::asio::io_context& io_context)
+		: socket_(io_context), m_io_context(io_context)
+	{
+
+	}
+
 	~CMessagePush();
 
-	void Init();
+	void Start();
 
 	void StopWork()
 	{
 		m_is_work = false;
 	}
 
+	void PushMessage(std::string msg);
+
 	//专门处理推送消息
-	void ReceiveMessage(tcp::socket& s);
+	void HandleMessage(std::string msg);
 
 private:
-	enum { max_length = 1024 };
+	void handle_read(const boost::system::error_code& error,
+		size_t bytes_transferred);
+
+	void handle_write(const boost::system::error_code& error);
 
+private:
 	bool m_is_work = true;
+
+	boost::asio::io_context& m_io_context;
+	tcp::socket socket_;
+	enum { max_length = 1024 };
+	char data_[max_length];
 };
 

+ 1 - 0
lewaimai_dispatch/pch/pch.h

@@ -37,6 +37,7 @@ using namespace std;
  *boost库的头文件
  **/
 #include <boost/asio.hpp>
+#include <boost/bind.hpp>
 
 /*
  *操作系统相关的头文件

+ 1 - 0
lewaimai_pathplanning/network/CClientSession.cpp

@@ -53,6 +53,7 @@ void CClientSession::handle_read(const boost::system::error_code& error,
         doc.SetObject();
         rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器
 
+		doc.AddMember("type", 0, allocator);
         doc.AddMember("status", "ok", allocator);
 
         rapidjson::StringBuffer buffer;