/**
* Copyright (c) 2006 - 2009 Smaxe Ltd (www.smaxe.com).
* All rights reserved.
*/
import com.smaxe.app.uv.agent.rtmp.RtmpClientInfo;
import com.smaxe.app.uv.loadtester.rtmp.RtmpTester;
import java.util.HashMap;
import java.util.Map;
/**
* <code>RtmpTesterLauncher</code> - {@link RtmpTester} launcher.
*
* @author Andrei Sochirca
*/
public final class RtmpTesterLauncher extends Object
{
/**
* Entry point.
*
* @param args
* @throws Exception
*/
public static void main(final String[] args) throws Exception
{
// NOTE:
// Evaluation version has a few limitations:
// 1. only "localhost" connection is allowed (url like: rtmp://localhost:1935/live)
// 2. only one client script executed at a time
// 3. client session duration is limited to 1 minute
// You can buy license at:
// http://www.smaxe.com/order.jsf
RtmpTester.setKey("00000-00000-00000-00000-00000");
// define client properties
Map<String, Object> clientProperties = new HashMap<String, Object>();
clientProperties.put("streamToPlay", "stream.flv");
// client info
RtmpClientInfo client = new RtmpClientInfo(script.PlayStreamScript.class.getCanonicalName(), clientProperties);
client.setGatherSessionInfo(true);
RtmpTester tester = new RtmpTester();
tester.emulateClient("rtmp://localhost:1935/live", client,
new RtmpTester.ICallback()
{
/**
* Notifies about connection to the server.
*/
public void onConnect(final RtmpTester.IClientSessionInfoProvider provider)
{
System.out.println("RtmpTesterCallback#onConnect: " + provider.id());
}
/**
* Notifies about disconnection from the server.
* You can use {@link RtmpTester.IClientSessionInfoProvider <tt>provider</tt>}
* to get session details.
*/
public void onDisconnect(final RtmpTester.IClientSessionInfoProvider provider)
{
System.out.println("RtmpTesterCallback#onDisconnect: " + provider.id());
// NOTE:
// RtmpTester can provide you with Bandwidth as a function of time
System.out.println("Bandwidth(t):");
for (Map<String, Object> entry : provider.getEntities(RtmpTester.IClientSessionInfoProvider.DATA_TRANSFER, null /*selector*/))
{
// bandwidth entry represents a map (field name -> value)
// for example,
// {stimestamp=1297, readBytes=87237, writtenBytes=3420, readPackets=221, writtenPackets=5}
// where stimestamp is session timestamp
System.out.println(entry);
}
// NOTE:
// RtmpTester can provide you with Method Invocations (methods invoked by both client and server)
System.out.println("Method invocation(t):");
for (Map<String, Object> entry : provider.getEntities(RtmpTester.IClientSessionInfoProvider.METHOD_INVOCATION, null /*selector*/))
{
// method invocation entry represents a map (field name -> value)
// for example,
// {stimestamp=203, source=CLIENT, method=createStream, arguments=null, result=33685, executionTime=47}
// where
// stimestamp is session timestamp,
// source is method invocation source (CLIENT or SERVER),
// method is method name,
// executionTime is method execution time, etc.
System.out.println(entry);
}
// NOTE:
// RtmpTester can provide you with SharedObject events
System.out.println("Shared Object(t):");
for (Map<String, Object> entry : provider.getEntities(RtmpTester.IClientSessionInfoProvider.SHARED_OBJECT, null /*selector*/))
{
// shared object entry represents a map (field name -> value)
// for example,
// {name=test, version=15, data={attribute=16}}
// where
// name is shared object name,
// version is shared object version,
// data is current shared object state,
System.out.println(entry);
}
// NOTE:
// RtmpTester can provide you with Streams (streams played or published by client)
System.out.println("Stream(t):");
for (Map<String, Object> entry : provider.getEntities(RtmpTester.IClientSessionInfoProvider.STREAM, null /*selector*/))
{
// stream entry represents a map (field name -> value)
System.out.println(entry);
}
// NOTE:
// RtmpTester can provide you with low level RTMP events (events sent by both client and server)
System.out.println("RTMP event(t):");
for (Map<String, Object> entry : provider.getEntities(RtmpTester.IClientSessionInfoProvider.EVENT, null /*selector*/))
{
// RTMP event entry represents a map (field name -> value)
// for example,
// {stimestamp=63, source=CLIENT, type=MI, stream=0, size=221, data=ClassObject [RTMP.INVOKE,{id=1, action=connect, parameters={objectEncoding=0, app=live, flashVer=WIN 9,0,124,0, fpad=false, tcUrl=rtmp://localhost:1935/live, audioCodecs=4095, videoFunction=1, pageUrl=, swfUrl=, videoCodecs=255}, arguments=null}]}
// where
// stimestamp is session timestamp,
// source is event source (CLIENT or SERVER), etc.
System.out.println(entry);
}
}
/**
* Notifies about occurred exception.
*/
public void onException(final RtmpTester.IClientSessionInfoProvider provider, final Exception e)
{
System.out.println("RtmpTesterCallback#onException: " + provider.id() + ", " + e.getMessage());
}
});
while (tester.getClients() > 0)
{
Thread.sleep(5 * 1000);
}
tester.release();
}
/**
* Constructor.
*/
private RtmpTesterLauncher()
{
}
}