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服务器的IPint 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”,还发了很多其它东西。