📄 incomingunicastserver.java
字号:
/* * Copyright (c) 2001-2007 Sun Microsystems, Inc. All rights reserved. * * The Sun Project JXTA(TM) Software License * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by Sun Microsystems, Inc. for JXTA(TM) technology." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. * * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must * not be used to endorse or promote products derived from this software * without prior written permission. For written permission, please contact * Project JXTA at http://www.jxta.org. * * 5. Products derived from this software may not be called "JXTA", nor may * "JXTA" appear in their name, without prior written permission of Sun. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN * MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * JXTA is a registered trademark of Sun Microsystems, Inc. in the United * States and other countries. * * Please see the license information page at : * <http://www.jxta.org/project/www/license.html> for instructions on use of * the license in source files. * * ==================================================================== * * This software consists of voluntary contributions made by many individuals * on behalf of Project JXTA. For more information on Project JXTA, please see * http://www.jxta.org. * * This license is based on the BSD license adopted by the Apache Foundation. */package net.jxta.impl.endpoint.tcp;import net.jxta.logging.Logging;import java.io.IOException;import java.io.InterruptedIOException;import java.net.*;import java.nio.channels.*;import java.nio.channels.spi.SelectorProvider;import java.text.MessageFormat;import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;import java.util.List;import java.util.concurrent.RejectedExecutionException;import java.util.logging.Level;import java.util.logging.Logger;/** * This server handles incoming unicast TCP connections */public class IncomingUnicastServer implements Runnable { /** * Logger */ private static final Logger LOG = Logger.getLogger(IncomingUnicastServer.class.getName()); /** * The transport which owns this server. */ private final TcpTransport transport; /** * The interface address the serverSocket will try to bind to. */ private final InetAddress serverBindLocalInterface; /** * The beginning of the port range the serverSocket will try to bind to. */ private final int serverBindStartLocalPort; /** * The port the serverSocket will try to bind to. */ private int serverBindPreferedLocalPort; /** * The end of the port range the serverSocket will try to bind to. */ private final int serverBindEndLocalPort; /** * The socket we listen for connections on. */ private ServerSocket serverSocket; /** * If true then the we are closed or closing. */ private volatile boolean closed = false; /** * The thread on which connection accepts will take place. */ private Thread acceptThread = null; /** * Channel Selector */ private Selector acceptSelector = null; /** * ServerSocket Channel */ private ServerSocketChannel serverSocChannel = null; /** * Constructor for the TCP server * * @param owner the TCP transport we are working for * @param serverInterface the network interface to use. * @param preferedPort the port we will be listening on. * @param startPort starting port * @param endPort the endport in port range * @throws IOException if an io severe occurs * @throws SecurityException if a security exception occurs */ public IncomingUnicastServer(TcpTransport owner, InetAddress serverInterface, int preferedPort, int startPort, int endPort) throws IOException, SecurityException { this.transport = owner; serverBindLocalInterface = serverInterface; serverBindPreferedLocalPort = preferedPort; serverBindStartLocalPort = startPort; serverBindEndLocalPort = endPort; openServerSocket(); } /** * Start this server. * * @return true if successfully started */ public synchronized boolean start() { if (acceptThread != null) { return false; } // Start daemon thread acceptThread = new Thread(transport.group.getHomeThreadGroup(), this, "TCP Transport ServerSocket accept for " + transport.getPublicAddress()); acceptThread.setDaemon(true); acceptThread.start(); return true; } /** * Stop this server. */ public synchronized void stop() { closed = true; Thread temp = acceptThread; if (null != temp) { // interrupt does not seem to have an effect on threads blocked in accept. temp.interrupt(); } // Closing the socket works though. try { serverSocket.close(); } catch (IOException ignored) { if (Logging.SHOW_SEVERE && LOG.isLoggable(Level.SEVERE)) { LOG.log(Level.SEVERE, "IO error occured while closing server socket", ignored); } } try { acceptSelector.close(); } catch (IOException io) { if (Logging.SHOW_SEVERE && LOG.isLoggable(Level.SEVERE)) { LOG.log(Level.SEVERE, "IO error occured while closing Selectors", io); } } } /** * Get the address of the network interface being used. * * @return the local socket address */ synchronized InetSocketAddress getLocalSocketAddress() { ServerSocket localSocket = serverSocket; if (null != localSocket) { return (InetSocketAddress) localSocket.getLocalSocketAddress(); } else { return null; } } /** * Get the start port range we are using * * @return starting port range */ int getStartPort() { return serverBindStartLocalPort; } /** * Get the end port range we are using * * @return the ending port range */ int getEndPort() { return serverBindEndLocalPort;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -