Ich verwende zum Kommunizieren über Sockets meistens die Object-I/O-Streams. Jetzt versuche ich wieder davon wegzukommen, weil ich gemerkt habe, dass die echt langsam sind. Außerdem fliegen oft (scheinbar grundlos) Exceptions. Selbst ein 2-Byte-langer String kommt erst mit (grob geschätzt) einer viertel Sekunde Verzögerung an, was man natürlich deutlich merkt. Deshalb habe ich die Klasse umgeschrieben, um sie per PrintWriter/BufferedReader zu schreiben/lesen und rekonstruieren. Nichts besonderes, aber kann ich trotzdem eure Meinung darüber haben? Und event. Verbesserungsvorschläge, was mir weiter helfen könnte, oder die Geschwindigkeit event. weiter steigert?
Java:
package core;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public class Command implements CommanandConstants
{
private static final int BUFFER_LENGHT = 2048;
private static final char[] BUFFER = new char[BUFFER_LENGHT];
private static Map<Socket, PrintWriter> writerMap;
private static Map<Socket, BufferedReader> readerMap;
private String command;
private String location;
private List<String> parameterList;
static
{
writerMap = new HashMap<Socket, PrintWriter>();
readerMap = new HashMap<Socket, BufferedReader>();
}
public Command(String command, String location)
{
super();
this.command = command;
this.location = location;
}
private Command(String readedData)
{
super();
String[] split = Pattern.compile(";").split(readedData, 0);
command = split[0];
location = split[1];
parameterList = new ArrayList<String>();
for(byte b = 2; b < split.length; b++)
parameterList.add(split[b]);
}
public void sendAboutSocket(Socket socket)
{
PrintWriter printWriter = writerMap.get(socket);
if(printWriter == null)
{
try
{
printWriter = new PrintWriter(socket.getOutputStream());
}
catch (IOException e)
{
e.printStackTrace();
}
writerMap.put(socket, printWriter);
}
printWriter.write(toString());
printWriter.flush();
}
public boolean hasCommand(String s)
{
return(command.equals(s));
}
public boolean hasLocation(String s)
{
return(location.equals(s));
}
public String toString()
{
String asString = command + ";" + location + ";";
if(parameterList != null)
for(byte b = 0; b < parameterList.size(); b++)
asString+= parameterList.get(b) + ";";
return(asString);
}
public String getParameter(int i)
{
String parameter = null;
if(parameterList == null)
parameter = parameterList.get(i);
return(parameter);
}
public static Command readFromSocket(Socket socket)
{
BufferedReader bufferedReader = readerMap.get(socket);
if(bufferedReader == null)
{
try
{
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
catch (IOException e)
{
e.printStackTrace();
}
readerMap.put(socket, bufferedReader);
}
Command command = null;
try
{
int charCount = bufferedReader.read(BUFFER, 0, BUFFER.length);
String commandAsString = String.valueOf(BUFFER, 0, charCount);
command = new Command(commandAsString);
}
catch (SocketException e) {}
catch (IOException e)
{
e.printStackTrace();
}
return(command);
}
public synchronized void addParameter(String parameter)
{
if(parameterList == null)
parameterList = new ArrayList<String>();
parameterList.add(parameter);
}
}