rendered paste bodyimport java.net.*;
import java.io.*;
final class Packet
{
private byte[] HEADER;
private byte[] DATA;
public Packet()
{
HEADER = new byte[3];
DATA = null;
}
public Packet(byte ident, byte[] data)
{
HEADER = new byte[3];
HEADER[0] = ident;
setData(data);
}
public byte[] getData()
{
return DATA;
}
public void setData(byte[] data)
{
this.DATA = data;
this.HEADER[2] = (byte)data.length;
}
public byte getIdent()
{
return this.HEADER[0];
}
public void setIdent(byte ident)
{
this.HEADER[0] = ident;
}
public boolean send(BufferedWriter outputStream)
{
try
{
for (int i = 0; i < HEADER.length; i++)
outputStream.write(HEADER[i]);
for (int i = 0; i < DATA.length; i++)
outputStream.write(DATA[i]);
outputStream.flush();
return true;
}
catch (IOException e)
{
e.printStackTrace();
return false;
}
}
}
public class Chatter
{
static final byte PACKET_CLIENT_HELLO = 0x01;
static final byte[] PACKET_CLIENT_HELLO_DATA = {0x53, 0x6B, 0x69, 0x4C, 0x4C, 0x6F, 0x72, 0x5A};
static final byte PACKET_SERVER_HELLO = (byte)0x81;
static final byte[] PACKET_SERVER_HELLO_DATA = {0x52, 0x6F, 0x58, 0x58, 0x6F, 0x72, 0x5A, 0x5A};
//byte[] nick; //{0x02,0x00,0x08,0x00,0x4F,0x00,0x74,0x00,0x74,0x00,0x6F};
private Socket SOCKET;
private BufferedReader INPUT_STREAM;
private BufferedWriter OUTPUT_STREAM;
public Chatter(String address, int port)
{
try
{
SOCKET = new Socket(address, port);
this.INPUT_STREAM = new BufferedReader(new InputStreamReader(SOCKET.getInputStream()));
this.OUTPUT_STREAM = new BufferedWriter(new OutputStreamWriter(SOCKET.getOutputStream()));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* Connects the client
*/
public boolean connect()
{
// send handshake packet
Packet packetOut = new Packet(PACKET_CLIENT_HELLO, PACKET_CLIENT_HELLO_DATA);
if (!packetOut.send(OUTPUT_STREAM))
return false;
//try{int c = INPUT_STREAM.read();System.out.println(c);}catch(IOException e){}
// verify response
Packet packetIn = getPacket();
return (packetIn != null && packetIn.getIdent() == PACKET_SERVER_HELLO);
}
/**
* Disconnects the client
*/
public void disconnect()
{
if (!isConnected())
return;
try
{
// close streams
INPUT_STREAM.close();
OUTPUT_STREAM.close();
SOCKET.close();
}
catch (IOException e)
{
// do nothing
}
}
public boolean isConnected()
{
return SOCKET.isConnected();
}
private Packet getPacket()
{
char[] buffer = new char[256];
try
{
if (INPUT_STREAM.read(buffer, 0, buffer.length) >= 3) // read more than 3 new chars?
{
Packet packet = new Packet();
// write packet header
packet.setIdent((byte)buffer[0]);
int length = (int)buffer[2];
// write packet body
byte[] data = new byte[length];
for (int i = 0; i < length; i++)
data[i] = (byte)buffer[i+3];
packet.setData(data);
return packet;
}
else
return null;
}
catch (IOException e)
{
//e.printStackTrace();
return null;
}
}
}