package se.rhel; import se.rhel.packet.BasePacketHandler; import se.rhel.packet.Packet; import se.rhel.util.Log; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; /** * Created by rkh on 2014-03-07. */ public class TcpConnection implements Runnable { private Thread mUpdateThread = null; private boolean mShouldRun = false; private Socket mSocket; private BasePacketHandler mPacketHandler; public TcpConnection(BasePacketHandler handler) { mPacketHandler = handler; } public void connect(InetAddress address, int tcpPort) throws IOException { mSocket = new Socket(address, tcpPort); mSocket.setTcpNoDelay(true); start(); } public void bindSocket(Socket socket) throws SocketException { mSocket = socket; mSocket.setTcpNoDelay(true); start(); } private void start() { mShouldRun = true; if(mUpdateThread == null) { mUpdateThread = new Thread(this, "TcpConnectionThread"); mUpdateThread.start(); } } public void run() { while(mShouldRun) { try { DataInputStream dis = new DataInputStream(mSocket.getInputStream()); byte[] data = new byte[Snaek.PACKAGE_SIZE]; dis.read(data); mPacketHandler.handlePacket(data); } catch (IOException e) { // Swallow the exception and just close the socket stop(); } } } /** * @return true if the connection is open, otherwise false */ public boolean isOpen() { return !mSocket.isClosed(); } public void sendTcp(byte[] data) { // Log.debug("TcpConnection", "size: " + data.length); if(isOpen()) { try { DataOutputStream output = new DataOutputStream(mSocket.getOutputStream()); output.write(data); output.flush(); } catch (IOException e) { Log.error("TcpConnection", e.getMessage()); } } else { Log.error("TcpConnection", "Socket is closed"); } } public void stop() { if(!mShouldRun) return; Log.info("TcpConnection", "Closing TcpConnection"); try { if(!mSocket.isClosed()) { mSocket.close(); } else { Log.error("TcpConnection", "Socket is already closed"); } } catch (IOException e) { e.printStackTrace(); } mShouldRun = false; } public Socket getSocket() { return mSocket; } public InetAddress getInetAddress() { return mSocket.getInetAddress(); } }