All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.googlecode.mycontainer.util.tunnel.TunnelConnection Maven / Gradle / Ivy

package com.googlecode.mycontainer.util.tunnel;

import java.io.Closeable;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

import com.googlecode.mycontainer.util.Util;

public class TunnelConnection implements Closeable {

	private Socket local;

	private Socket remote;

	private TunnelData localData;

	private TunnelData remoteData;

	public Socket getLocal() {
		return local;
	}

	public TunnelConnection setLocal(Socket local) {
		try {
			this.local = local;
			this.localData = new TunnelData(local.getInputStream());
			return this;
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public Socket getRemote() {
		return remote;
	}

	public TunnelConnection setRemote(Socket remote) {
		try {
			this.remote = remote;
			this.remoteData = new TunnelData(remote.getInputStream());
			return this;
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public void close() {
		Util.close(local);
		Util.close(remote);
	}

	@Override
	public String toString() {
		return "[TunnelConnection " + toString(local) + " " + toString(remote) + "]";
	}

	private String toString(Socket sck) {
		try {
			if (!sck.isConnected()) {
				return "[Socket disconnected]";
			}
			InetAddress addr = sck.getInetAddress();
			String host = addr == null ? null : addr.getHostAddress();
			int port = sck.getPort();
			int localPort = sck.getLocalPort();
			return new StringBuilder().append(localPort).append(":").append(host).append(":").append(port).toString();
		} catch (Exception e) {
			return sck.toString();
		}
	}

	public void readData() {
		boolean localStopped = localData.isStopped();
		if (!localStopped) {
			localData.readData();
		}
		boolean remoteStopped = remoteData.isStopped();
		if (!remoteStopped) {
			remoteData.readData();
		}
	}

	public TunnelData getLocalData() {
		return localData;
	}

	public void setLocalData(TunnelData localData) {
		this.localData = localData;
	}

	public TunnelData getRemoteData() {
		return remoteData;
	}

	public void setRemoteData(TunnelData remoteData) {
		this.remoteData = remoteData;
	}

	public void writeRemote(byte[] data) {
		try {
			OutputStream out = remote.getOutputStream();
			out.write(data);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public void writeLocal(byte[] data) {
		try {
			OutputStream out = local.getOutputStream();
			out.write(data);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public boolean isStopped() {
		return local.isClosed() || remote.isClosed();
	}

	public boolean hasBuffer() {
		return localData.hasBuffer() || remoteData.hasBuffer();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy