Network protocol rewrite:

* packets don't depend on serialization any longer (and they shouldn't since they are simple DTOs)
* support for multiple serialization types - add custom protocols when needed
* web client serialization protocol uses gSon
This commit is contained in:
Maxmtg
2013-04-21 11:23:17 +00:00
parent bad3cf3191
commit b5d094e430
37 changed files with 372 additions and 411 deletions

29
.gitattributes vendored
View File

@@ -14323,21 +14323,22 @@ src/main/java/forge/net/client/state/InLobbyClientState.java -text
src/main/java/forge/net/client/state/UnauthorizedClientState.java -text src/main/java/forge/net/client/state/UnauthorizedClientState.java -text
src/main/java/forge/net/client/state/package-info.java -text src/main/java/forge/net/client/state/package-info.java -text
src/main/java/forge/net/package-info.java -text src/main/java/forge/net/package-info.java -text
src/main/java/forge/net/protocol/incoming/AuthorizePacket.java -text src/main/java/forge/net/protocol/ClientProtocol.java -text
src/main/java/forge/net/protocol/incoming/ChatPacket.java -text src/main/java/forge/net/protocol/ClientProtocolJson.java -text
src/main/java/forge/net/protocol/incoming/EchoPacket.java -text
src/main/java/forge/net/protocol/incoming/IPacket.java -text
src/main/java/forge/net/protocol/incoming/IncorrectPacket.java -text
src/main/java/forge/net/protocol/incoming/PacketOpcode.java -text
src/main/java/forge/net/protocol/incoming/UnknownPacket.java -text
src/main/java/forge/net/protocol/incoming/package-info.java -text
src/main/java/forge/net/protocol/outcoming/AuthorizationSuccessfulMessage.java -text
src/main/java/forge/net/protocol/outcoming/ChatMessage.java -text
src/main/java/forge/net/protocol/outcoming/EchoMessage.java -text
src/main/java/forge/net/protocol/outcoming/IMessage.java -text
src/main/java/forge/net/protocol/outcoming/IncorrectPacketMessage.java -text
src/main/java/forge/net/protocol/outcoming/UnknownPacketMessage.java -text
src/main/java/forge/net/protocol/package-info.java -text src/main/java/forge/net/protocol/package-info.java -text
src/main/java/forge/net/protocol/toclient/AuthResultPacketClt.java -text
src/main/java/forge/net/protocol/toclient/ChatPacketClt.java -text
src/main/java/forge/net/protocol/toclient/EchoPacketClt.java -text
src/main/java/forge/net/protocol/toclient/ErrorIncorrectPacketClt.java -text
src/main/java/forge/net/protocol/toclient/ErrorUnknownPacketClt.java -text
src/main/java/forge/net/protocol/toclient/IPacketClt.java -text
src/main/java/forge/net/protocol/toserver/AuthorizePacketSrv.java -text
src/main/java/forge/net/protocol/toserver/ChatPacketSrv.java -text
src/main/java/forge/net/protocol/toserver/EchoPacketSrv.java -text
src/main/java/forge/net/protocol/toserver/IPacketSrv.java -text
src/main/java/forge/net/protocol/toserver/IncorrectPacketSrv.java -text
src/main/java/forge/net/protocol/toserver/UnknownPacketSrv.java -text
src/main/java/forge/net/protocol/toserver/package-info.java -text
src/main/java/forge/package-info.java svneol=native#text/plain src/main/java/forge/package-info.java svneol=native#text/plain
src/main/java/forge/properties/ForgePreferences.java svneol=native#text/plain src/main/java/forge/properties/ForgePreferences.java svneol=native#text/plain
src/main/java/forge/properties/NewConstants.java svneol=native#text/plain src/main/java/forge/properties/NewConstants.java svneol=native#text/plain

View File

@@ -701,6 +701,11 @@
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<version>13.0.1</version> <version>13.0.1</version>
</dependency> </dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.3</version>
</dependency>
<dependency> <dependency>
<groupId>com.thoughtworks.xstream</groupId> <groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId> <artifactId>xstream</artifactId>

View File

@@ -4,7 +4,7 @@ import org.apache.commons.lang.NotImplementedException;
import forge.game.GameState; import forge.game.GameState;
import forge.net.client.INetClient; import forge.net.client.INetClient;
import forge.net.protocol.outcoming.ChatMessage; import forge.net.protocol.toclient.ChatPacketClt;
public class LobbyPlayerRemote extends LobbyPlayer { public class LobbyPlayerRemote extends LobbyPlayer {
@@ -31,6 +31,6 @@ public class LobbyPlayerRemote extends LobbyPlayer {
@Override @Override
public void hear(LobbyPlayer player, String message) { public void hear(LobbyPlayer player, String message) {
connection.send(new ChatMessage(player.getName(), message)); connection.send(new ChatPacketClt(player.getName(), message));
} }
} }

View File

@@ -2,7 +2,7 @@ package forge.net.client;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.net.client.state.IClientState; import forge.net.client.state.IClientState;
import forge.net.protocol.outcoming.IMessage; import forge.net.protocol.toclient.IPacketClt;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
@@ -14,7 +14,7 @@ public interface INetClient {
* TODO: Write javadoc for this method. * TODO: Write javadoc for this method.
* @param echoMessage * @param echoMessage
*/ */
void send(IMessage message); void send(IPacketClt message);
void createPlayer(String playerName); void createPlayer(String playerName);

View File

@@ -10,20 +10,24 @@ import forge.net.IConnectionObserver;
import forge.net.client.state.ConnectedClientState; import forge.net.client.state.ConnectedClientState;
import forge.net.client.state.UnauthorizedClientState; import forge.net.client.state.UnauthorizedClientState;
import forge.net.client.state.IClientState; import forge.net.client.state.IClientState;
import forge.net.protocol.incoming.IPacket; import forge.net.protocol.ClientProtocol;
import forge.net.protocol.incoming.PacketOpcode; import forge.net.protocol.ClientProtocolJson;
import forge.net.protocol.outcoming.IMessage; import forge.net.protocol.toclient.IPacketClt;
import forge.net.protocol.toserver.IPacketSrv;
public class NetClient implements IConnectionObserver, INetClient{ public class NetClient implements IConnectionObserver, INetClient{
private final IClientSocket socket; private final IClientSocket socket;
private BlockingDeque<IClientState> state = new LinkedBlockingDeque<IClientState>(); private final BlockingDeque<IClientState> state = new LinkedBlockingDeque<IClientState>();
private LobbyPlayer player = null; private LobbyPlayer player = null;
private final ClientProtocol<IPacketSrv, IPacketClt> protocol;
public NetClient(IClientSocket clientSocket) { public NetClient(IClientSocket clientSocket) {
socket = clientSocket; socket = clientSocket;
state.push(new ConnectedClientState(this)); state.push(new ConnectedClientState(this));
state.push(new UnauthorizedClientState(this)); state.push(new UnauthorizedClientState(this));
protocol = new ClientProtocolJson();
} }
public void autorized() { public void autorized() {
@@ -48,7 +52,7 @@ public class NetClient implements IConnectionObserver, INetClient{
/** Receives input from network client */ /** Receives input from network client */
@Override @Override
public void onMessage(String data) { public void onMessage(String data) {
IPacket p = PacketOpcode.decode(data); IPacketSrv p = protocol.decodePacket(data);
for(IClientState s : state) { for(IClientState s : state) {
if ( s.processPacket(p) ) if ( s.processPacket(p) )
break; break;
@@ -57,8 +61,9 @@ public class NetClient implements IConnectionObserver, INetClient{
@Override @Override
public void send(IMessage message) { public void send(IPacketClt message) {
socket.send(message.toNetString()); String rawData = protocol.encodePacket(message);
socket.send(rawData);
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -1,12 +1,12 @@
package forge.net.client.state; package forge.net.client.state;
import forge.net.client.INetClient; import forge.net.client.INetClient;
import forge.net.protocol.incoming.EchoPacket; import forge.net.protocol.toclient.EchoPacketClt;
import forge.net.protocol.incoming.IncorrectPacket; import forge.net.protocol.toclient.ErrorIncorrectPacketClt;
import forge.net.protocol.incoming.IPacket; import forge.net.protocol.toclient.ErrorUnknownPacketClt;
import forge.net.protocol.outcoming.EchoMessage; import forge.net.protocol.toserver.EchoPacketSrv;
import forge.net.protocol.outcoming.IncorrectPacketMessage; import forge.net.protocol.toserver.IPacketSrv;
import forge.net.protocol.outcoming.UnknownPacketMessage; import forge.net.protocol.toserver.IncorrectPacketSrv;
@@ -19,22 +19,20 @@ public class ConnectedClientState implements IClientState {
} }
@Override @Override
public boolean processPacket(IPacket packet ) { public boolean processPacket(IPacketSrv packet ) {
switch( packet.getOpCode() ) { if( packet instanceof EchoPacketSrv) {
case Echo: EchoPacketSrv pe = (EchoPacketSrv)packet;
EchoPacket pe = (EchoPacket)packet; client.send(new EchoPacketClt(pe.getMessage()));
client.send(new EchoMessage(pe.getMessage()));
return true;
case Incorrect:
IncorrectPacket pi = (IncorrectPacket)packet;
client.send(new IncorrectPacketMessage(pi));
return true;
default:
client.send(new UnknownPacketMessage());
return true; return true;
} }
if( packet instanceof IncorrectPacketSrv) {
IncorrectPacketSrv pi = (IncorrectPacketSrv)packet;
client.send(new ErrorIncorrectPacketClt(pi.getMessage()));
return true;
}
client.send(new ErrorUnknownPacketClt());
return true;
} }
} }

View File

@@ -1,11 +1,11 @@
package forge.net.client.state; package forge.net.client.state;
import forge.net.protocol.incoming.IPacket; import forge.net.protocol.toserver.IPacketSrv;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
* *
*/ */
public interface IClientState { public interface IClientState {
boolean processPacket(IPacket data); boolean processPacket(IPacketSrv data);
} }

View File

@@ -3,9 +3,8 @@ package forge.net.client.state;
import forge.Singletons; import forge.Singletons;
import forge.control.ChatArea; import forge.control.ChatArea;
import forge.net.client.INetClient; import forge.net.client.INetClient;
import forge.net.protocol.incoming.ChatPacket; import forge.net.protocol.toserver.ChatPacketSrv;
import forge.net.protocol.incoming.IPacket; import forge.net.protocol.toserver.IPacketSrv;
import forge.net.protocol.incoming.PacketOpcode;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
@@ -19,10 +18,9 @@ public class InLobbyClientState implements IClientState {
} }
@Override @Override
public boolean processPacket(IPacket data) { public boolean processPacket(IPacketSrv data) {
if( data.getOpCode() == PacketOpcode.Chat) if( data instanceof ChatPacketSrv) {
{ ChatPacketSrv cp = (ChatPacketSrv) data;
ChatPacket cp = (ChatPacket) data;
// if ( not muted ) // if ( not muted )
Singletons.getControl().getLobby().speak(ChatArea.Room, client.getPlayer(), cp.getMessage()); Singletons.getControl().getLobby().speak(ChatArea.Room, client.getPlayer(), cp.getMessage());
// else // else

View File

@@ -1,10 +1,9 @@
package forge.net.client.state; package forge.net.client.state;
import forge.net.client.INetClient; import forge.net.client.INetClient;
import forge.net.protocol.incoming.AuthorizePacket; import forge.net.protocol.toclient.AuthResultPacketClt;
import forge.net.protocol.incoming.IPacket; import forge.net.protocol.toserver.AuthorizePacketSrv;
import forge.net.protocol.incoming.PacketOpcode; import forge.net.protocol.toserver.IPacketSrv;
import forge.net.protocol.outcoming.AuthorizationSuccessfulMessage;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
@@ -23,11 +22,11 @@ public class UnauthorizedClientState implements IClientState {
@Override @Override
public boolean processPacket(IPacket packet) { public boolean processPacket(IPacketSrv packet) {
if( packet.getOpCode() == PacketOpcode.Authorize ) { if( packet instanceof AuthorizePacketSrv ) {
AuthorizePacket p = (AuthorizePacket)packet; AuthorizePacketSrv p = (AuthorizePacketSrv)packet;
if( true ) { // check credentials here! if( true ) { // check credentials here!
client.send(new AuthorizationSuccessfulMessage(p.getUsername())); client.send(new AuthResultPacketClt(p.getUsername(), true));
client.createPlayer(p.getUsername()); client.createPlayer(p.getUsername());

View File

@@ -0,0 +1,9 @@
package forge.net.protocol;
/** The protocol is in charge of serialization of internal classes into whatever remote client understands.
* Descendants may use different techniques to serialize data, be it Gson, ProtoBuf or common Java serialization */
public interface ClientProtocol<TIncoming, TOutComing> {
TIncoming decodePacket(String data);
String encodePacket(TOutComing packet);
}

View File

@@ -0,0 +1,82 @@
package forge.net.protocol;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.google.gson.Gson;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSyntaxException;
import forge.net.protocol.toclient.AuthResultPacketClt;
import forge.net.protocol.toclient.ChatPacketClt;
import forge.net.protocol.toclient.EchoPacketClt;
import forge.net.protocol.toclient.ErrorIncorrectPacketClt;
import forge.net.protocol.toclient.ErrorUnknownPacketClt;
import forge.net.protocol.toclient.IPacketClt;
import forge.net.protocol.toserver.AuthorizePacketSrv;
import forge.net.protocol.toserver.ChatPacketSrv;
import forge.net.protocol.toserver.EchoPacketSrv;
import forge.net.protocol.toserver.IPacketSrv;
import forge.net.protocol.toserver.IncorrectPacketSrv;
import forge.net.protocol.toserver.UnknownPacketSrv;
import forge.util.TextUtil;
/**
* The expected incoming message format is: /{opcode} {json-object}, where opcode is a string among keys of headerToClassInbound
* If string starts with a non-slash character, the whole line is considered a chat packet
*
*/
public class ClientProtocolJson implements ClientProtocol<IPacketSrv, IPacketClt> {
private final static Map<String, Class<? extends IPacketSrv>> headerToClassInbound = new HashMap<String, Class<? extends IPacketSrv>>();
private final static Map<Class<? extends IPacketClt>, String> classToHeaderOutbound = new HashMap<Class<? extends IPacketClt>, String>();
// Static ctor to fill maps
static {
// The what remote part sends us
headerToClassInbound.put("echo", EchoPacketSrv.class);
headerToClassInbound.put("s", ChatPacketSrv.class);
headerToClassInbound.put("auth", AuthorizePacketSrv.class);
// The what we reply there
classToHeaderOutbound.put(AuthResultPacketClt.class, "auth");
classToHeaderOutbound.put(ChatPacketClt.class, "s");
classToHeaderOutbound.put(EchoPacketClt.class, "echo");
classToHeaderOutbound.put(ErrorIncorrectPacketClt.class, "err:packet_args");
classToHeaderOutbound.put(ErrorUnknownPacketClt.class, "err:packet");
}
private final Gson gson = new Gson(); // looks like a single instance per class is enough
@Override
public IPacketSrv decodePacket(String data) {
if ( '/' != data.charAt(0) )
return new ChatPacketSrv(data);
data = data.substring(1);
String[] parts = TextUtil.split(data, ' ', 2);
Class<? extends IPacketSrv> packetClass = headerToClassInbound.get(parts[0]);
if( null == packetClass )
return new IncorrectPacketSrv("Unknown header: " + parts[0]);
String args = parts.length > 1 ? parts[1] : null;
if ( StringUtils.isBlank(args) )
args = "{}"; // assume default empty object
try {
return gson.fromJson(parts[1].trim(), packetClass);
} catch( JsonParseException ex ) {
return new IncorrectPacketSrv("Invalid json: " + args);
}
}
@Override
public String encodePacket(IPacketClt packet) {
Class<? extends IPacketClt> packetClass = packet.getClass();
String prefix = classToHeaderOutbound.get(packetClass);
return String.format("%s %s", prefix != null ? prefix : "/!unserialized!: " + packetClass.getName(), gson.toJson(packet));
}
}

View File

@@ -1,50 +0,0 @@
package forge.net.protocol.incoming;
import org.apache.commons.lang3.StringUtils;
import forge.util.TextUtil;
/**
* TODO: Write javadoc for this type.
*
*/
public class AuthorizePacket implements IPacket {
private final String username;
private final String password;
private AuthorizePacket(String name, String pass) {
username = name;
password = pass;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public static IPacket parse(String data) {
String[] parts = TextUtil.splitWithParenthesis(data, ' ', '\"', '\"');
if(parts.length == 1 || parts.length == 2) {
if(!StringUtils.isAlphanumericSpace(parts[0]))
return new IncorrectPacket(PacketOpcode.Authorize, 0, parts[0]);
if( parts.length == 1)
return new AuthorizePacket(parts[0], null);
if(!StringUtils.isAsciiPrintable(parts[1]))
return new IncorrectPacket(PacketOpcode.Authorize, 1, parts[1]);
else
return new AuthorizePacket(parts[0], parts[1]);
}
return UnknownPacket.parse(data);
}
@Override
public PacketOpcode getOpCode() {
return PacketOpcode.Authorize;
}
}

View File

@@ -1,23 +0,0 @@
package forge.net.protocol.incoming;
/**
* TODO: Write javadoc for this type.
*
*/
public class ChatPacket implements IPacket {
private final String message;
public ChatPacket(String data) {
message = data;
}
public String getMessage() {
return message;
}
@Override
public PacketOpcode getOpCode() {
return PacketOpcode.Chat;
}
}

View File

@@ -1,28 +0,0 @@
package forge.net.protocol.incoming;
/**
* TODO: Write javadoc for this type.
*
*/
public class EchoPacket implements IPacket {
private final String message;
private EchoPacket(String data) {
message = data;
}
public static EchoPacket parse(String data) {
return new EchoPacket(data);
}
public String getMessage() {
return message;
}
@Override
public PacketOpcode getOpCode() {
return PacketOpcode.Echo;
}
}

View File

@@ -1,10 +0,0 @@
package forge.net.protocol.incoming;
/**
* TODO: Write javadoc for this type.
*
*/
public interface IPacket {
PacketOpcode getOpCode();
}

View File

@@ -1,36 +0,0 @@
package forge.net.protocol.incoming;
/**
* TODO: Write javadoc for this type.
*
*/
public class IncorrectPacket implements IPacket {
private final PacketOpcode intendedCode;
private final int index;
private final String sParam;
public IncorrectPacket(PacketOpcode code, int iParameter, String value) {
intendedCode = code;
index = iParameter;
sParam = value;
}
public String getString() {
return sParam;
}
public int getIndex() {
return index;
}
public PacketOpcode getIntendedCode() {
return intendedCode;
}
@Override
public PacketOpcode getOpCode() {
return PacketOpcode.Incorrect;
}
}

View File

@@ -1,53 +0,0 @@
package forge.net.protocol.incoming;
/**
* TODO: Write javadoc for this type.
*
*/
public enum PacketOpcode {
Echo("/echo"),
Chat("/s"),
Authorize("/auth"),
Incorrect(null),
Unknown(null);
private final String opcode;
private PacketOpcode(String code) {
opcode = code;
}
public final String getOpcode() {
return opcode;
}
/**
* TODO: Write javadoc for this method.
* @param data
* @return
*/
public static IPacket decode(String data) {
for(PacketOpcode s : PacketOpcode.values()) {
if ( s.opcode != null && data.startsWith(s.opcode) )
return decodePacket(s, data.substring(s.opcode.length()).trim());
}
if( data.startsWith("/") )
return UnknownPacket.parse(data.substring(1));
else
return new ChatPacket(data);
}
private static IPacket decodePacket(PacketOpcode code, String data) {
switch(code) {
case Echo: return EchoPacket.parse(data);
case Authorize: return AuthorizePacket.parse(data);
default: return UnknownPacket.parse(data);
}
}
}

View File

@@ -1,32 +0,0 @@
package forge.net.protocol.incoming;
/**
* TODO: Write javadoc for this type.
*
*/
public class UnknownPacket implements IPacket {
private final String message;
private UnknownPacket(String data) {
message = data;
}
public String getMessage() {
return message;
}
/**
* TODO: Write javadoc for this method.
* @param substring
* @return
*/
public static IPacket parse(String substring) {
return new UnknownPacket(substring);
}
@Override
public PacketOpcode getOpCode() {
return PacketOpcode.Unknown;
}
}

View File

@@ -1,21 +0,0 @@
package forge.net.protocol.outcoming;
/**
* TODO: Write javadoc for this type.
*
*/
public class AuthorizationSuccessfulMessage implements IMessage {
private final String username;
public AuthorizationSuccessfulMessage(String user) {
username = user;
}
@Override
public String toNetString() {
// TODO Auto-generated method stub
return "Authorization Successful. Welcome, " + username;
}
}

View File

@@ -1,24 +0,0 @@
package forge.net.protocol.outcoming;
/**
* TODO: Write javadoc for this type.
*
*/
public class ChatMessage implements IMessage {
private final String player;
private final String message;
public ChatMessage(String playerName, String message) {
// TODO Auto-generated constructor stub
this.message = message;
this.player = playerName;
}
@Override
public String toNetString() {
// TODO Auto-generated method stub
return String.format("%s: %s", player, message);
}
}

View File

@@ -1,26 +0,0 @@
package forge.net.protocol.outcoming;
/**
* TODO: Write javadoc for this type.
*
*/
public class EchoMessage implements IMessage {
private final String message;
/**
* TODO: Write javadoc for Constructor.
* @param message2
*/
public EchoMessage(String message) {
this.message = message;
}
@Override
public String toNetString() {
return String.format("Echo: %s", message);
}
}

View File

@@ -1,9 +0,0 @@
package forge.net.protocol.outcoming;
/**
* TODO: Write javadoc for this type.
*
*/
public interface IMessage {
public String toNetString();
}

View File

@@ -1,18 +0,0 @@
package forge.net.protocol.outcoming;
import forge.net.protocol.incoming.IncorrectPacket;
public class IncorrectPacketMessage implements IMessage {
IncorrectPacket badPacket;
public IncorrectPacketMessage(IncorrectPacket packet) {
badPacket = packet;
}
@Override
public String toNetString() {
return String.format("Wrong syntax for %s command: parameter #%d is %s", badPacket.getIntendedCode().getOpcode(), 1+badPacket.getIndex(), badPacket.getString());
}
}

View File

@@ -1,17 +0,0 @@
package forge.net.protocol.outcoming;
/**
* TODO: Write javadoc for this type.
*
*/
public class UnknownPacketMessage implements IMessage {
/* (non-Javadoc)
* @see forge.net.protocol.outcoming.Message#toNetString()
*/
@Override
public String toNetString() {
return "Unkown packet received";
}
}

View File

@@ -0,0 +1,23 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public class AuthResultPacketClt implements IPacketClt {
private final boolean successful;
private final String username;
public AuthResultPacketClt(String user, boolean success) {
username = user;
successful = success;
}
public boolean isSuccessful() {
return successful;
}
public String getUsername() {
return username;
}
}

View File

@@ -0,0 +1,25 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public class ChatPacketClt implements IPacketClt {
private final String actor;
private final String message;
public ChatPacketClt(String playerName, String message) {
// TODO Auto-generated constructor stub
this.message = message;
this.actor = playerName;
}
public String getActor() {
return actor;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,24 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public class EchoPacketClt implements IPacketClt {
private final String message;
/**
* TODO: Write javadoc for Constructor.
* @param message2
*/
public EchoPacketClt(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,17 @@
package forge.net.protocol.toclient;
/**
* A response packet to an Incorrect packet client had sent to server
*/
public class ErrorIncorrectPacketClt implements IPacketClt {
private final String message;
public ErrorIncorrectPacketClt(String msg) {
message = msg;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,11 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public class ErrorUnknownPacketClt implements IPacketClt {
}

View File

@@ -0,0 +1,8 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public interface IPacketClt {
}

View File

@@ -0,0 +1,24 @@
package forge.net.protocol.toserver;
/**
* TODO: Write javadoc for this type.
*
*/
public class AuthorizePacketSrv implements IPacketSrv {
private final String username;
private final String password;
private AuthorizePacketSrv(String name, String pass) {
username = name;
password = pass;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}

View File

@@ -0,0 +1,16 @@
package forge.net.protocol.toserver;
/**
* TODO: Write javadoc for this type.
*
*/
public class ChatPacketSrv implements IPacketSrv {
private final String message;
public ChatPacketSrv(String data) {
message = data;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,22 @@
package forge.net.protocol.toserver;
/**
* TODO: Write javadoc for this type.
*
*/
public class EchoPacketSrv implements IPacketSrv {
private final String message;
private EchoPacketSrv(String data) {
message = data;
}
public static EchoPacketSrv parse(String data) {
return new EchoPacketSrv(data);
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,5 @@
package forge.net.protocol.toserver;
/** A common ancestor for all packets directed to server */
public interface IPacketSrv {}

View File

@@ -0,0 +1,18 @@
package forge.net.protocol.toserver;
/**
* TODO: Write javadoc for this type.
*
*/
public class IncorrectPacketSrv implements IPacketSrv {
private final String message;
public IncorrectPacketSrv(String errorMessage) {
message = errorMessage;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,18 @@
package forge.net.protocol.toserver;
/**
* TODO: Write javadoc for this type.
*
*/
public class UnknownPacketSrv implements IPacketSrv {
private final String message;
public UnknownPacketSrv(String data) {
message = data;
}
public String getMessage() {
return message;
}
}

View File

@@ -1,3 +1,3 @@
/** Model (as in model-view-controller) for Forge. */ /** Model (as in model-view-controller) for Forge. */
package forge.net.protocol.incoming; package forge.net.protocol.toserver;