/* This file is part of leafdigital leafChat. leafChat is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. leafChat is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with leafChat. If not, see <http://www.gnu.org/licenses/>. Copyright 2011 Samuel Marshall. */ package com.leafdigital.net; import java.io.IOException; import java.net.*; import leafchat.core.api.PluginContext; /** * Server socket that listens for connections directly on the current computer * and knows its local address. */ public class DirectServerSocket extends ServerSocket { private String externalAddress; /** * @param context Plugin context * @throws IOException Error creating socket */ public DirectServerSocket(PluginContext context) throws IOException { NetPlugin np=(NetPlugin)context.getPlugin(); // Select port from list for(int port=np.getListenPortMin();port<=np.getListenPortMax();port++) { try { bind(new InetSocketAddress(port)); break; } catch(IOException e) { // If we've run out of attempts, throw the error, otherwise try next if(port==np.getListenPortMax()) { IOException e2=new IOException("No ports available"); e2.initCause(e); throw e; } } } // Select address... // 1. Do we have a reported address that is useful? InetAddress ia=np.getReportedAddress(); if(ia!=null) { externalAddress=ia.getHostAddress(); } else { // 2. Has the user manually set one? externalAddress = np.getManualPublicAddress(); if(externalAddress==null) { // 3. Get the local address ia=InetAddress.getLocalHost(); if(!NetPlugin.isValidAddress(ia)) throw new IOException("Unable to determine external IP address. Please set address manually in Connections page."); externalAddress=ia.getHostAddress(); } } } /** * @return External address */ public String getExternalAddress() { return externalAddress; } }