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.ServerSocket; 23 import java.net.Socket; 24 import java.net.URI; 25 import java.net.URISyntaxException; 26 27 import javax.net.ServerSocketFactory; 28 import javax.net.SocketFactory; 29 30 import org.activeio.SynchChannel; 31 import org.activeio.SynchChannelFactory; 32 import org.activeio.SynchChannelServer; 33 34 /*** 35 * A TcpSynchChannelFactory creates {@see org.activeio.net.TcpSynchChannel} 36 * and {@see org.activeio.net.TcpSynchChannelServer} objects. 37 * 38 * @version $Revision$ 39 */ 40 public class SocketSynchChannelFactory implements SynchChannelFactory { 41 42 protected static final int DEFAULT_BACKLOG = 500; 43 44 private final SocketFactory socketFactory; 45 private final ServerSocketFactory serverSocketFactory; 46 private int backlog = DEFAULT_BACKLOG; 47 48 public SocketSynchChannelFactory() { 49 this(SocketFactory.getDefault(), ServerSocketFactory.getDefault()); 50 } 51 52 public SocketSynchChannelFactory(SocketFactory socketFactory, ServerSocketFactory serverSocketFactory) { 53 this.socketFactory = socketFactory; 54 this.serverSocketFactory = serverSocketFactory; 55 } 56 57 /*** 58 * Uses the {@param location}'s host and port to create a tcp connection to a remote host. 59 * 60 * @see org.activeio.SynchChannelFactory#openSynchChannel(java.net.URI) 61 */ 62 public SynchChannel openSynchChannel(URI location) throws IOException { 63 Socket socket=null; 64 socket = socketFactory.createSocket(location.getHost(), location.getPort()); 65 return createSynchChannel(socket); 66 } 67 68 /*** 69 * @param socket 70 * @return 71 * @throws IOException 72 */ 73 protected SynchChannel createSynchChannel(Socket socket) throws IOException { 74 return new SocketSynchChannel(socket); 75 } 76 77 /*** 78 * Binds a server socket a the {@param location}'s port. 79 * 80 * @see org.activeio.SynchChannelFactory#bindSynchChannel(java.net.URI) 81 */ 82 public SynchChannelServer bindSynchChannel(URI bindURI) throws IOException { 83 84 String host = bindURI.getHost(); 85 InetAddress addr; 86 if( (host == null || host.length() == 0 || host.equals("localhost") ) ) { 87 addr = InetAddress.getLocalHost(); 88 } else { 89 addr = InetAddress.getByName(host); 90 } 91 ServerSocket serverSocket; 92 93 if (addr.equals(InetAddress.getLocalHost())) { 94 serverSocket = serverSocketFactory.createServerSocket(bindURI.getPort(), backlog); 95 } else { 96 serverSocket = serverSocketFactory.createServerSocket(bindURI.getPort(), backlog, addr); 97 } 98 99 URI connectURI=bindURI; 100 try { 101 connectURI = URISupport.changeHost(connectURI, addr.getHostName()); 102 connectURI = URISupport.changePort(connectURI, serverSocket.getLocalPort()); 103 } catch (URISyntaxException e) { 104 throw (IOException)new IOException("Could build connect URI: "+e).initCause(e); 105 } 106 107 return new SocketSynchChannelServer(serverSocket, bindURI, connectURI); 108 } 109 110 /*** 111 * @return Returns the backlog. 112 */ 113 public int getBacklog() { 114 return backlog; 115 } 116 117 /*** 118 * @param backlog 119 * The backlog to set. 120 */ 121 public void setBacklog(int backlog) { 122 this.backlog = backlog; 123 } 124 125 126 }