package com.netifera.platform.net.sockets; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import java.nio.channels.SocketChannel; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import com.netifera.platform.net.sockets.internal.Activator; import com.netifera.platform.net.sockets.internal.SocketEngineService; import com.netifera.platform.util.addresses.inet.InternetAddress; import com.netifera.platform.util.locators.TCPSocketLocator; public class TCPChannel extends AsynchronousSocketChannel { public static TCPChannel open() throws IOException { return Activator.getInstance().getSocketEngine().openTCP(); } public TCPChannel(SocketEngineService engine, SocketChannel channel) { this.engine = engine; this.channel = channel; } @Override public SocketChannel getWrappedChannel() { return (SocketChannel)channel; } private Socket getSocket() { return getWrappedChannel().socket(); } public void bind(TCPSocketLocator local) throws IOException { getSocket().bind(new InetSocketAddress(local.getAddress().toInetAddress(), local.getPort())); } public <A> Future<Void> connect(TCPSocketLocator remote, long timeout, TimeUnit unit, A attachment, CompletionHandler<Void, ? super A> handler) throws IOException, InterruptedException { return engine.asynchronousConnect(this, remote, timeout, unit, attachment, handler); } public TCPSocketLocator getRemoteAddress() { InetSocketAddress address = (InetSocketAddress)getSocket().getRemoteSocketAddress(); if (address == null) { return null; } return new TCPSocketLocator(InternetAddress.fromInetAddress(address.getAddress()), address.getPort()); } public TCPSocketLocator getLocalAddress() { if (!getSocket().isBound()) { return null; } InetSocketAddress address = (InetSocketAddress)getSocket().getLocalSocketAddress(); if (address == null) { return null; } return new TCPSocketLocator(InternetAddress.fromInetAddress(address.getAddress()), address.getPort()); } private static String getAddrPort(TCPSocketLocator locator) { return locator.getAddress().toString() + ':' + locator.getPort(); } @Override public String toString() { if (getSocket().isClosed()) { return "tcp/[closed]"; } if (!getSocket().isConnected()) { return "tcp/[not connected]"; } return "tcp/[" + getAddrPort(getLocalAddress()) + " <> " + getAddrPort(getRemoteAddress()) + ']'; } }