1 /*** 2 * 3 * Copyright 2004 Hiram Chirino 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 **/ 18 package org.activeio.net; 19 20 import java.io.IOException; 21 import java.net.InetAddress; 22 import java.net.InetSocketAddress; 23 import java.net.URI; 24 import java.net.URISyntaxException; 25 26 import org.activeio.AsynchChannel; 27 import org.activeio.AsynchChannelFactory; 28 import org.activeio.AsynchChannelServer; 29 import org.activeio.adapter.SynchToAsynchChannelServerAdapter; 30 import org.activeio.filter.WriteBufferedAsynchChannel; 31 import org.activeio.packet.ByteBufferPacket; 32 33 import com.ibm.io.async.AsyncServerSocketChannel; 34 import com.ibm.io.async.AsyncSocketChannel; 35 36 /*** 37 * A TcpAsynchChannelFactory creates {@see org.activeio.net.TcpAsynchChannel} 38 * and {@see org.activeio.net.TcpAsynchChannelServer} objects. 39 * 40 * @version $Revision$ 41 */ 42 public class AIOAsynchChannelFactory implements AsynchChannelFactory { 43 44 protected static final int DEFAULT_BACKLOG = 500; 45 private int backlog = DEFAULT_BACKLOG; 46 47 /*** 48 * Uses the {@param location}'s host and port to create a tcp connection to a remote host. 49 * 50 * @see org.activeio.AsynchChannelFactory#openAsynchChannel(java.net.URI) 51 */ 52 public AsynchChannel openAsynchChannel(URI location) throws IOException { 53 AsyncSocketChannel channel = AsyncSocketChannel.open(); 54 channel.connect(new InetSocketAddress(location.getHost(), location.getPort())); 55 return createAsynchChannel(channel); 56 } 57 58 /*** 59 * @param channel 60 * @return 61 * @throws IOException 62 */ 63 protected AsynchChannel createAsynchChannel(AsyncSocketChannel socketChannel) throws IOException { 64 AsynchChannel channel = new AIOAsynchChannel(socketChannel); 65 channel = new WriteBufferedAsynchChannel(channel, ByteBufferPacket.createDefaultBuffer(true), false); 66 return channel; 67 } 68 69 /*** 70 * Binds a server socket a the {@param location}'s port. 71 * 72 * @see org.activeio.AsynchChannelFactory#bindAsynchChannel(java.net.URI) 73 */ 74 public AsynchChannelServer bindAsynchChannel(URI bindURI) throws IOException { 75 76 String host = bindURI.getHost(); 77 InetSocketAddress address; 78 if ( host == null || host.length() == 0 || host.equals("localhost") || host.equals("0.0.0.0") ) { 79 address = new InetSocketAddress(bindURI.getPort()); 80 } else { 81 address = new InetSocketAddress(bindURI.getHost(), bindURI.getPort()); 82 } 83 84 AsyncServerSocketChannel serverSocketChannel = AsyncServerSocketChannel.open(); 85 serverSocketChannel.socket().bind(address,backlog); 86 87 URI connectURI = bindURI; 88 try { 89 connectURI = URISupport.changeHost(connectURI, InetAddress.getLocalHost().getHostName()); 90 connectURI = URISupport.changePort(connectURI, serverSocketChannel.socket().getLocalPort()); 91 } catch (URISyntaxException e) { 92 throw (IOException)new IOException("Could not build connect URI: "+e).initCause(e); 93 } 94 95 return SynchToAsynchChannelServerAdapter.adapt( 96 new AIOSynchChannelServer(serverSocketChannel, bindURI, connectURI)); 97 } 98 99 /*** 100 * @return Returns the backlog. 101 */ 102 public int getBacklog() { 103 return backlog; 104 } 105 106 /*** 107 * @param backlog 108 * The backlog to set. 109 */ 110 public void setBacklog(int backlog) { 111 this.backlog = backlog; 112 } 113 114 115 }