package com.cxy.redisclient.integration.protocol;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.cxy.redisclient.integration.ConfigFile;
import com.cxy.redisclient.integration.I18nFile;
import com.cxy.redisclient.presentation.RedisClient;
public class RedisSession {
private static final String CODEC = "UTF8";
private static final String NEWLINE = "\r\n";
private String host;
private int port;
private boolean connected;
Socket socket = null;
InputStream byteReader = null;
OutputStream byteWriter = null;
public RedisSession(String host, int port) {
this.host = host;
this.port = port;
}
public void connect() throws IOException {
socket = new Socket(host, port);
byteReader = socket.getInputStream();
byteWriter = socket.getOutputStream();
socket.setSoTimeout(ConfigFile.getT2());
connected = true;
}
public void disconnect() throws IOException {
byteReader.close();
byteWriter.close();
socket.close();
}
public Result execute(String command) throws IOException {
if(!connected)
connect();
Pattern pattern = Pattern.compile("(\".*?\"\\s*)|(\\S+)");
Matcher matcher = pattern.matcher(command.trim());
int number = 0;
String cmd = "";
String parameter;
while (matcher.find()) {
parameter = matcher.group();
if(parameter.charAt(0) == '"'){
int index = parameter.lastIndexOf('"');
if(index == 0)
throw new RuntimeException(RedisClient.i18nFile.getText(I18nFile.CMDEXCEPTION));
parameter = parameter.substring(1, index);
}
cmd += "$";
cmd += parameter.length();
cmd += NEWLINE;
cmd += parameter;
cmd += NEWLINE;
number++;
}
String cmdStr1 = "*" + number + NEWLINE + cmd;
String cmdStr = cmdStr1;
try{
byteWriter.write(cmdStr.getBytes(CODEC));
byteWriter.flush();
String head = ReplyParser.getHeadString(byteReader, CODEC);
ReplyParser parser = ReplyParser.getParser(head);
return parser.parse(head, byteReader,CODEC);
} catch(IOException e){
connected = false;
throw e;
}
}
}