EasyDarwin接口的使用——使用C++编写客户端实现与EasyDarwin服务器的交互

    EasyDarwin提供了接口供客户端使用,以实现客户端与其的交互。比如,根据EasyDarwin的8.1.0版本的接口文档,有获取推流列表的接口如下所示:

    我们可以测试一下上述接口。首先启动EasyDarwin服务器,启动后在浏览器(比如QQ浏览器中)输入“http://127.0.0.1:10008/api/v1/pushers”(格式为:'流媒体服务器所在电脑的IP' : 'easydarwin.ini中设置的http端口号' + '接口消息'),输入后按回车,可以看到浏览器显示如下信息。因为目前没有在推流,所以显示的信息如下所示,total为0,rows也没有。这些显示的信息就是EasyDarwin服务器收到浏览器发给它的"api/v1/pushers"消息后返回的响应。可以看到这个接口是正常的。

接下来我们以获取推流列表为例子,根据上述接口编写C++客户端。在vs2015中新建控制台程序,输入如下代码。代码参考《C++ 一个简单的实现HTTP GET和POST请求的类

HttpRequest.h

#pragma once
#include <string>
#include <vector>

class HttpRequest
{
public:
	HttpRequest(const std::string& ip, int port);
	~HttpRequest(void);
	std::string HttpGet(std::string req);  //进行Http的GET请求
private:
	std::string m_ip;   //需要连接的http服务器的IP
	int m_port;         //需要连接的http服务器的端口号
};

HttpRequest.cpp

#include "HttpRequest.h"
#include <WinSock.h>
#include <iostream>

#pragma comment(lib, "ws2_32.lib")

HttpRequest::HttpRequest(const std::string& ip, int port) : m_ip(ip), m_port(port)
{
}


HttpRequest::~HttpRequest(void)
{
}

//进行Http的GET请求
std::string HttpRequest::HttpGet(std::string req)
{
	std::string ret = "";     //返回Http的Response(响应)
	try
	{
		/*进行socket初始化*/
		WSADATA wData;
		::WSAStartup(MAKEWORD(2, 2), &wData);

		SOCKET clientSocket = socket(AF_INET, 1, 0);
		struct sockaddr_in ServerAddr = { 0 };
		ServerAddr.sin_addr.s_addr = inet_addr(m_ip.c_str());
		ServerAddr.sin_port = htons(m_port);
		ServerAddr.sin_family = AF_INET;
		int errNo = connect(clientSocket, (sockaddr *)&ServerAddr, sizeof(ServerAddr));  //连接服务器
		if (0 == errNo)                            //如果成功连接上服务器
		{
			std::string strSend = " HTTP/1.1\r\n"
				"Host: 192.168.1.104:10008\r\n"
				"Connection: keep-alive\r\n"
				"Cache-Control: max-age=0\r\n"
				"Upgrade-Insecure-Requests: 1\r\n"
				"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3732.400 QQBrowser/10.5.3819.400\r\n"
				"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n"
				"Accept-Encoding: gzip, deflate\r\n"
				"Accept-Language: zh-CN,zh;q=0.9\r\n"
				"Cookie: token=42C0EN0ZR\r\n\r\n";

			strSend = "GET " + req + strSend;

			errNo = send(clientSocket, strSend.c_str(), strSend.length(), 0);   //发送缓冲区strSend中的信息给服务器
			if (errNo > 0)
			{
				std::cout << "发送成功" << std::endl;
			}
			else
			{
				std::cout << "发送失败" << std::endl;
				//std::cout << "errNo:" << errNo << std::endl;
				return ret;
			}

			int buf_size = 5000;
			char *bufRecv = new char[buf_size]();   //申请buf_size大小的空间并初始化为0,将指针bufRecv指向该空间
			errNo = recv(clientSocket, bufRecv, buf_size, 0);
			if (errNo > 0)           // 如果接收响应成功,则返回接收的数据内容
			{
				ret = bufRecv;        
				delete[] bufRecv;
			}
			else                     //如果接收响应失败
			{
				std::cout << "接收失败" << std::endl;
				delete[] bufRecv;
				//std::cout << "errNo:" << errNo << std::endl;
				return ret;
			}
		}
		else        //如果连接不上服务器
		{
			errNo = WSAGetLastError();
			std::cout << "errNo:" << errNo << std::endl;
		}
		// socket环境清理
		::WSACleanup();
	}
	catch (...)
	{
		return "";
	}
	return ret;
}

main.cpp

#include "HttpRequest.h"
#include <iostream>
#include <Windows.h>

int main(int argc, char *argv[])
{
	HttpRequest httpReq("127.0.0.1", 10008);
	std::string res = httpReq.HttpGet("/api/v1/pushers");
	std::cout << res << std::endl;
	return 0;
}

输入代码完成后,编译,运行,可以看到控制台输出如下,证明客户端获取EasyDarwin的推流列表成功了。

这里要注意一个问题,如果在客户端中,仅仅发消息“Get /api/v1/pushers”给服务器是无法成功获取响应的,还得发HTTP头。使用Wireshark对客户端发送的数据进行抓包,可以看到发送的数据如下所示,可以看到除了“Get /api/v1/pushers”,还发了很多其它东西。

发布了54 篇原创文章 · 获赞 55 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/u014552102/article/details/102826521