package org.sinrel.engine.library;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
public final class Online {
private int max_players, amount_players, port;
private String address;
/**
* @param address адрес сервера
* @param port порт сервера
* @throws Exception
*/
public Online( String address, int port ) throws Exception {
this.getOnline( address, port );
}
private final static String readString( DataInputStream in , int par ) throws IOException {
int sh = in.readShort();
if (sh > par) {
throw new IOException( "Поступила длина строки больше, чем максимально допустимая (" + sh + " > " + par + ")" );
} else if (sh < 0) {
throw new IOException( "Поступила длина строки меньше нуля!" );
} else {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < sh; i++ ) {
sb.append( in.readChar() );
}
return sb.toString();
}
}
private final void getOnline( String address, int port ) throws Exception {
Socket soc = null;
DataInputStream in = null;
DataOutputStream out = null;
try {
soc = new Socket();
soc.setTcpNoDelay(true);
soc.setTrafficClass(18);
soc.connect( new InetSocketAddress( address , port ) );
in = new DataInputStream( soc.getInputStream() );
out = new DataOutputStream( soc.getOutputStream() );
out.write(254);
if (in.read() != 255) {
throw new IOException("Bad message");
}
String s = readString( in, 256 );
char[] c = s.toCharArray();
s = new String(c);
String[] ar = s.split("\u00a7");
s = ar[0];
amount_players = Integer.parseInt( ar[1] );
max_players = Integer.parseInt( ar[2] );
this.address = address;
this.port = port;
} catch ( Exception e ) {
throw new Exception("Не удалось получить онлайн сервера!");
}finally{
soc.close();
}
}
/**
* Обновляет данные об онлайне
* @throws Exception
*/
public final void refresh() throws Exception {
this.getOnline( this.getAddress() , this.getPort() );
}
/**
* @return возвращает порт по которому была получена информация о онлайне сервера
*/
public final int getPort() {
return port;
}
/**
* @return возвращает адрес по которому была получена информация о онлайне сервера
*/
public final String getAddress() {
return address;
}
/**
* @return возвращает количество игроков играющих на сервере
*/
public final int getPlayersAmount() {
return amount_players;
}
/**
* @return возвращает максимальное количество игроков способных играть на сервере одновременно (=количество слотов)
*/
public final int getServerSize() {
return max_players;
}
}