Jmeter 如何集成JAVA请求采样器&x2B;Red5客户端库
如何为Java请求采样器实现Java类 用JMeter进行RTMP性能测试 Red5—最早的RTMP服务器之一,用Java编写 如何实现Jmeter到Red5 pro服务器 如何测试视频场景 请帮帮我 我想测试RTMP视频流录制是否正确。示例实现假设如下:Jmeter 如何集成JAVA请求采样器&x2B;Red5客户端库,jmeter,rtmp,red5pro,Jmeter,Rtmp,Red5pro,如何为Java请求采样器实现Java类 用JMeter进行RTMP性能测试 Red5—最早的RTMP服务器之一,用Java编写 如何实现Jmeter到Red5 pro服务器 如何测试视频场景 请帮帮我 我想测试RTMP视频流录制是否正确。示例实现假设如下: package RTMPSubscriber; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.Abstr
package RTMPSubscriber;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class App implements JavaSamplerClient {
@Override
public void setupTest(JavaSamplerContext javaSamplerContext) {
}
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
String url = javaSamplerContext.getParameter("url");
int port = Integer.parseInt(javaSamplerContext.getParameter("port"));
String app = javaSamplerContext.getParameter("app");
String streamName = javaSamplerContext.getParameter("name");
int timeout = Integer.parseInt(javaSamplerContext.getParameter("timeout"));
SampleResult result = new SampleResult();
result.sampleStart();
result.setSampleLabel("Test Sample");
Subscriber sub = new Subscriber( url, port, app, streamName, timeout);
sub.Subscribe();
result.sampleEnd();
if(!sub.exception) {
result.setResponseMessage("OK");
result.setSuccessful(true);
} else {
result.setResponseMessage("Error. See logs. If the log does not " +
"contain information about the error, I forgot about some exceptions and I am really sorry. T_T");
result.setSuccessful(false);
}
return result;
}
@Override
public void teardownTest(JavaSamplerContext javaSamplerContext) {
}
@Override
public Arguments getDefaultParameters() {
Arguments defaultParameters = new Arguments();
defaultParameters.addArgument("url","localhost");
defaultParameters.addArgument("port","1935");
defaultParameters.addArgument("app","live");
defaultParameters.addArgument("name","stream");
defaultParameters.addArgument("timeout","600");
return defaultParameters;
}
}
参考的<代码>订阅者类别:
package RTMPSubscriber;
import org.red5.client.net.rtmp.ClientExceptionHandler;
import org.red5.client.net.rtmp.INetStreamEventHandler;
import org.red5.client.net.rtmp.RTMPClient;
import org.red5.io.utils.ObjectMap;
import org.red5.server.api.event.IEvent;
import org.red5.server.api.event.IEventDispatcher;
import org.red5.server.api.service.IPendingServiceCall;
import org.red5.server.api.service.IPendingServiceCallback;
import org.red5.server.api.stream.IStreamPacket;
import org.red5.server.net.rtmp.event.Notify;
import org.red5.server.net.rtmp.status.StatusCodes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Subscriber {
private Logger log = LoggerFactory.getLogger(Subscriber.class);
private final String url;
private final int port;
private final String application;
private final String streamName;
private int timeout;
private RTMPClient client;
public boolean exception = false;
/**
* @param url
* @param port
* @param application
* @param streamName
*/
public Subscriber(String url, int port, String application, String streamName, int timeout) {
this.url = url;
this.port = port;
this.application = application;
this.streamName = streamName;
this.timeout = timeout;
}
public void Subscribe() {
client = new RTMPClient();
client.setServiceProvider(this);
client.setExceptionHandler(new ClientExceptionHandler() {
@Override
public void handleException(Throwable throwable) {
exception=true;
throwable.printStackTrace();
}
});
client.setStreamEventDispatcher(new IEventDispatcher() {
@Override
public void dispatchEvent(IEvent event) {
// @SuppressWarnings("unused")
IStreamPacket data = (IStreamPacket) event;
System.out.println("dispatchEvent: " + event);
if(event.toString().contains("Video"))
{
System.out.println("dispatchEvent: " + event);
}
}
});
final INetStreamEventHandler netStreamEventHandler = new INetStreamEventHandler() {
@Override
public void onStreamEvent(Notify notify) {
System.out.println("ClientStream.onStreamEvent: " + notify);
}
};
client.setStreamEventHandler(netStreamEventHandler);
final IPendingServiceCallback streamCallback = new IPendingServiceCallback() {
@Override
public void resultReceived(IPendingServiceCall call) {
if (call.getServiceMethodName().equals("createStream")) {
Number streamId = (Number) call.getResult();
// -2: live then recorded, -1: live, >=0: recorded
// streamId, streamName, mode, length
System.out.println("streamCallback:resultReceived: (streamId " + streamId + ")");
client.play(streamId, streamName, -1, 0);
}
}
};
IPendingServiceCallback connectCallback = new IPendingServiceCallback() {
@Override
public void resultReceived(IPendingServiceCall call) {
ObjectMap<?, ?> map = (ObjectMap<?, ?>) call.getResult();
String code = (String) map.get("code");
System.out.println("connectCallback: (code " + code + ")");
// Server connection established, but issue in connection.
if (StatusCodes.NC_CONNECT_FAILED.equals(code) || StatusCodes.NC_CONNECT_REJECTED.equals(code) || StatusCodes.NC_CONNECT_INVALID_APPLICATION.equals(code)) {
log.error("Rejected: " + map.get("description"));
exception=true;
client.disconnect();
}
// If connection successful, establish a stream
else if (StatusCodes.NC_CONNECT_SUCCESS.equals(code)) {
client.createStream(streamCallback);
} else {
exception=true;
log.error("ERROR code:" + code);
}
}
};
client.connect(url, port, client.makeDefaultConnectionParams(url, port, application), connectCallback);
try {
Thread.sleep(timeout*1000);
} catch (InterruptedException e) {
exception=true;
log.error("Exception: " + e);
}
client.disconnect();
System.out.println("End");
}
public void onBWCheck(Object params) {
System.out.println("onBWCheck: " + params);
}
/**
* Called when bandwidth has been configured.
*/
public void onBWDone(Object params) {
System.out.println("onBWDone: " + params);
}
public void onStatus(Object params) {
System.out.println("onStatus: " + params);
String status = params.toString();
// if stream is stopped or unpublished
if (status.indexOf("Stop") != -1 || status.indexOf("UnPublish") != -1) {
client.disconnect();
}
}
}
包rtmps订户;
导入org.red5.client.net.rtmp.ClientExceptionHandler;
导入org.red5.client.net.rtmp.inetstreamventhandler;
导入org.red5.client.net.rtmp.RTMPClient;
导入org.red5.io.utils.ObjectMap;
导入org.red5.server.api.event.IEvent;
导入org.red5.server.api.event.IEventDispatcher;
导入org.red5.server.api.service.IPendingServiceCall;
导入org.red5.server.api.service.IPendingServiceCallback;
导入org.red5.server.api.stream.IStreamPacket;
导入org.red5.server.net.rtmp.event.Notify;
导入org.red5.server.net.rtmp.status.StatusCodes;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
公共类订户{
私有日志记录器log=LoggerFactory.getLogger(Subscriber.class);
私有最终字符串url;
私人最终国际港口;
私有最终字符串应用程序;
私有最终字符串streamName;
私有int超时;
私有rtmpc客户端;
公共布尔异常=false;
/**
*@param-url
*@param端口
*@param应用程序
*@param streamName
*/
公共订阅服务器(字符串url、int端口、字符串应用程序、字符串流名称、int超时){
this.url=url;
this.port=端口;
这个应用程序=应用程序;
this.streamName=streamName;
this.timeout=超时;
}
公开无效订阅(){
client=新的RTMPClient();
client.setServiceProvider(本);
client.setExceptionHandler(新的ClientExceptionHandler(){
@凌驾
公共无效句柄例外(可丢弃可丢弃){
异常=真;
printStackTrace();
}
});
client.setStreamEventDispatcher(新的IEventDispatcher(){
@凌驾
公共无效调度事件(IEvent事件){
//@SuppressWarnings(“未使用”)
IStreamPacket数据=(IStreamPacket)事件;
System.out.println(“dispatchEvent:+事件”);
if(event.toString()包含(“视频”))
{
System.out.println(“dispatchEvent:+事件”);
}
}
});
最终InetStreamVenthandler netStreamEventHandler=新的InetStreamVenthandler(){
@凌驾
公共无效onStreamEvent(通知){
System.out.println(“ClientStream.onStreamEvent:+notify”);
}
};
client.setStreamEventHandler(netStreamEventHandler);
最终IPendingServiceCallback streamCallback=新IPendingServiceCallback(){
@凌驾
已接收公共无效结果(IPendingServiceCall调用){
if(调用.getServiceMethodName().equals(“createStream”)){
Number streamId=(Number)call.getResult();
//-2:直播然后录制,-1:直播,>=0:录制
//streamId、streamName、模式、长度
System.out.println(“streamCallback:resultReceived:(streamId“+streamId+”);
play(streamId,streamName,-1,0);
}
}
};
IPendingServiceCallback connectCallback=新的IPendingServiceCallback(){
@凌驾
已接收公共无效结果(IPendingServiceCall调用){
ObjectMap=(ObjectMap)调用.getResult();
字符串代码=(字符串)map.get(“代码”);
System.out.println(“connectCallback:(code“+code+”);
//已建立服务器连接,但连接中出现问题。
如果(StatusCodes.NC|U CONNECT_失败。等于(代码)|状态代码。NC|U CONNECT_被拒绝。等于(代码)|状态代码。NC|U CONNECT_无效_应用程序。等于(代码)){
log.error(“拒绝:”+map.get(“说明”);
异常=真;
client.disconnect();
}
//如果连接成功,则建立流
else if(StatusCodes.NC\u CONNECT\u SUCCESS.equals(code)){
createStream(streamCallback);
}否则{
异常=真;
日志错误(“错误代码:+代码”);
}
}
};
connect(url、端口、client.makeDefaultConnectionParams(url、端口、应用程序)、connectCallback);
试一试{
线程睡眠(超时*1000);
}捕捉(中断异常e){
异常=真;
日志错误(“异常:+e”);
}
client.disconnect();
系统输出打印项次(“结束”);
}
公共void onBWCheck(对象参数){
System.out.println(“onBWCheck:+params”);
}
/**
*配置带宽后调用。
*/
公共void onBWDone(对象参数){
System.out.println(“onBWDone:+params”);
}
public void onStatus(对象参数){
System.out.println(“onStatus:+params”);
字符串状态=params.toString();
//如果流已停止或未发布
if(status.indexOf(“停止”)!=-1 | | status.indexOf(“取消发布”)!=-1){
client.disconnect();
}
}
}
更多信息: