package scouter.agent.netio.data.net;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import scouter.agent.Configure;
import scouter.agent.netio.request.ReqestHandlingProxy;
import scouter.io.DataInputX;
import scouter.io.DataOutputX;
import scouter.lang.pack.Pack;
import scouter.net.NetCafe;
import scouter.net.TcpFlag;
import scouter.util.FileUtil;
import scouter.util.IntKeyLinkedMap;
public class TcpWorker implements Runnable {
public static IntKeyLinkedMap<TcpWorker> LIVE = new IntKeyLinkedMap<TcpWorker>();
public static String localAddr = null;
public int objHash = Configure.getInstance().getObjHash();
public void run() {
if (socket == null)
return;
try {
processV2(socket);
} catch (Throwable t) {
} finally {
close();
}
}
public void close() {
FileUtil.close(socket);
socket = null;
LIVE.remove(this.hashCode());
}
protected Socket socket = null;
public boolean prepare() {
Configure conf = Configure.getInstance();
String host = conf.net_collector_ip;
int port = conf.net_collector_tcp_port;
int so_timeout = conf.net_collector_tcp_so_timeout_ms;
int connection_timeout = conf.net_collector_tcp_connection_timeout_ms;
socket = new Socket();
try {
socket.connect(new InetSocketAddress(host, port), connection_timeout);
socket.setSoTimeout(so_timeout);
if (localAddr == null) {
localAddr = socket.getLocalAddress().getHostAddress();
}
LIVE.put(this.hashCode(), this);
return true;
} catch (Exception e) {
return false;
}
}
private void process(Socket socket) throws IOException {
DataInputX in = null;
DataOutputX out = null;
try {
in = new DataInputX(new BufferedInputStream(socket.getInputStream()));
out = new DataOutputX(new BufferedOutputStream(socket.getOutputStream()));
out.writeInt(NetCafe.TCP_AGENT);
out.writeInt(objHash);
out.flush();
while (objHash == Configure.getInstance().getObjHash()) {
String cmd = in.readText();
Pack parameter = (Pack) in.readPack();
Pack res = ReqestHandlingProxy.process(cmd, parameter, in, out);
if (res != null) {
out.writeByte(TcpFlag.HasNEXT);
out.writePack(res);
}
out.writeByte(TcpFlag.NoNEXT);
out.flush();
}
} finally {
FileUtil.close(in);
FileUtil.close(out);
}
}
private void processV2(Socket socket) throws IOException {
DataInputX in = null;
DataOutputX out = null;
Configure conf = Configure.getInstance();
try {
in = new DataInputX(new BufferedInputStream(socket.getInputStream()));
out = new DataOutputX(new BufferedOutputStream(socket.getOutputStream()));
String server_addr = conf.net_collector_ip;
int port = conf.net_collector_tcp_port;
out.writeInt(NetCafe.TCP_AGENT_V2);
out.writeInt(objHash);
out.flush();
//에이전트 이름, 서버 주소포트가 같은 동안만 세션을 유지하라.
while (objHash == Configure.getInstance().getObjHash() && server_addr.equals(conf.net_collector_ip)
&& port == conf.net_collector_tcp_port) {
byte[] buff = in.readIntBytes();
DataInputX in2 = new DataInputX(buff);
String cmd = in2.readText();
Pack parameter = (Pack) in2.readPack();
Pack res = ReqestHandlingProxy.process(cmd, parameter, in, out);
if (res != null) {
out.writeByte(TcpFlag.HasNEXT);
byte[] obuff = new DataOutputX().writePack(res).toByteArray();
out.writeIntBytes(obuff);
}
out.writeByte(TcpFlag.NoNEXT);
out.flush();
}
} finally {
FileUtil.close(in);
FileUtil.close(out);
}
}
}