📄 networkmanager.java
字号:
/*
* Created on Jul 29, 2004
* Created by Alon Rohter
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* This program 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 2
* of the License, or (at your option) any later version.
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package com.aelitis.azureus.core.networkmanager;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import org.gudy.azureus2.core3.config.*;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.global.GlobalManagerListener;
import org.gudy.azureus2.core3.util.Debug;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.networkmanager.impl.*;
import com.aelitis.azureus.core.peermanager.messaging.*;
/**
*
*/
public class NetworkManager {
public static final int UNLIMITED_RATE = 1024 * 1024 * 100; //100 mbyte/s
private static final NetworkManager instance = new NetworkManager();
protected static int tcp_mss_size;
protected static int max_download_rate_bps;
protected static int max_upload_rate_bps_normal;
protected static int max_upload_rate_bps_seeding_only;
protected static int max_upload_rate_bps;
protected static int max_lan_upload_rate_bps;
protected static int max_lan_download_rate_bps;
protected static boolean seeding_only_mode_allowed;
protected static boolean seeding_only_mode = false;
public static boolean REQUIRE_CRYPTO_HANDSHAKE;
public static boolean INCOMING_HANDSHAKE_FALLBACK_ALLOWED;
public static boolean OUTGOING_HANDSHAKE_FALLBACK_ALLOWED;
static {
COConfigurationManager.addAndFireParameterListeners(
new String[]{ "network.transport.encrypted.require",
"network.transport.encrypted.fallback.incoming",
"network.transport.encrypted.fallback.outgoing",
"Max Upload Speed KBs",
"Max LAN Upload Speed KBs",
"Max Upload Speed Seeding KBs",
"enable.seedingonly.upload.rate",
"Max Download Speed KBs",
"Max LAN Download Speed KBs",
"network.tcp.mtu.size" },
new ParameterListener() {
public void parameterChanged( String ignore ) {
REQUIRE_CRYPTO_HANDSHAKE = COConfigurationManager.getBooleanParameter( "network.transport.encrypted.require");
INCOMING_HANDSHAKE_FALLBACK_ALLOWED = COConfigurationManager.getBooleanParameter( "network.transport.encrypted.fallback.incoming");
OUTGOING_HANDSHAKE_FALLBACK_ALLOWED = COConfigurationManager.getBooleanParameter( "network.transport.encrypted.fallback.outgoing");
max_upload_rate_bps_normal = COConfigurationManager.getIntParameter( "Max Upload Speed KBs" ) * 1024;
if( max_upload_rate_bps_normal < 1024 ) max_upload_rate_bps_normal = UNLIMITED_RATE;
if( max_upload_rate_bps_normal > UNLIMITED_RATE ) max_upload_rate_bps_normal = UNLIMITED_RATE;
max_lan_upload_rate_bps = COConfigurationManager.getIntParameter( "Max LAN Upload Speed KBs" ) * 1024;
if( max_lan_upload_rate_bps < 1024 ) max_lan_upload_rate_bps = UNLIMITED_RATE;
if( max_lan_upload_rate_bps > UNLIMITED_RATE ) max_lan_upload_rate_bps = UNLIMITED_RATE;
max_upload_rate_bps_seeding_only = COConfigurationManager.getIntParameter( "Max Upload Speed Seeding KBs" ) * 1024;
if( max_upload_rate_bps_seeding_only < 1024 ) max_upload_rate_bps_seeding_only = UNLIMITED_RATE;
if( max_upload_rate_bps_seeding_only > UNLIMITED_RATE ) max_upload_rate_bps_seeding_only = UNLIMITED_RATE;
seeding_only_mode_allowed = COConfigurationManager.getBooleanParameter( "enable.seedingonly.upload.rate" );
max_download_rate_bps = COConfigurationManager.getIntParameter( "Max Download Speed KBs" ) * 1024;
if( max_download_rate_bps < 1024 ) max_download_rate_bps = UNLIMITED_RATE;
if( max_download_rate_bps > UNLIMITED_RATE ) max_download_rate_bps = UNLIMITED_RATE;
max_lan_download_rate_bps = COConfigurationManager.getIntParameter( "Max LAN Download Speed KBs" ) * 1024;
if( max_lan_download_rate_bps < 1024 ) max_lan_download_rate_bps = UNLIMITED_RATE;
if( max_lan_download_rate_bps > UNLIMITED_RATE ) max_lan_download_rate_bps = UNLIMITED_RATE;
tcp_mss_size = COConfigurationManager.getIntParameter( "network.tcp.mtu.size" ) - 40;
refreshRates();
}
});
}
private final ConnectDisconnectManager connect_disconnect_manager = new ConnectDisconnectManager();
private final IncomingSocketChannelManager incoming_socketchannel_manager = new IncomingSocketChannelManager();
private final WriteController write_controller = new WriteController();
private final ReadController read_controller = new ReadController();
private final TransferProcessor upload_processor = new TransferProcessor( TransferProcessor.TYPE_UPLOAD, new LimitedRateGroup(){
public int getRateLimitBytesPerSecond() { return max_upload_rate_bps; }
});
private final TransferProcessor download_processor = new TransferProcessor( TransferProcessor.TYPE_DOWNLOAD, new LimitedRateGroup(){
public int getRateLimitBytesPerSecond() { return max_download_rate_bps; }
});
private final TransferProcessor lan_upload_processor = new TransferProcessor( TransferProcessor.TYPE_UPLOAD, new LimitedRateGroup(){
public int getRateLimitBytesPerSecond() { return max_lan_upload_rate_bps; }
});
private final TransferProcessor lan_download_processor = new TransferProcessor( TransferProcessor.TYPE_DOWNLOAD, new LimitedRateGroup(){
public int getRateLimitBytesPerSecond() { return max_lan_download_rate_bps; }
});
private final LimitedRateGroup unlimited_rate_group = new LimitedRateGroup() {
public int getRateLimitBytesPerSecond() { return 0; }
};
private NetworkManagerStats stats = new NetworkManagerStats();
private NetworkManager() {
/* nothing */
}
private static void refreshRates() {
if( isSeedingOnlyUploadRate() ) {
max_upload_rate_bps = max_upload_rate_bps_seeding_only;
}
else {
max_upload_rate_bps = max_upload_rate_bps_normal;
}
if( max_upload_rate_bps < 1024 ) {
Debug.out( "max_upload_rate_bps < 1024=" +max_upload_rate_bps);
}
//ensure that mss isn't greater than up/down rate limits
if( tcp_mss_size > max_upload_rate_bps ) tcp_mss_size = max_upload_rate_bps - 1;
if( tcp_mss_size > max_download_rate_bps ) tcp_mss_size = max_download_rate_bps - 1;
if( tcp_mss_size > max_lan_upload_rate_bps ) tcp_mss_size = max_lan_upload_rate_bps -1;
if( tcp_mss_size > max_lan_download_rate_bps ) tcp_mss_size = max_lan_download_rate_bps -1;
if( tcp_mss_size < 512 ) tcp_mss_size = 512;
}
public static boolean isSeedingOnlyUploadRate() {
return seeding_only_mode_allowed && seeding_only_mode;
}
public static int getMaxUploadRateBPSNormal() {
if( max_upload_rate_bps_normal == UNLIMITED_RATE ) return 0;
return max_upload_rate_bps_normal;
}
public static int getMaxUploadRateBPSSeedingOnly() {
if( max_upload_rate_bps_seeding_only == UNLIMITED_RATE ) return 0;
return max_upload_rate_bps_seeding_only;
}
public static int getMaxDownloadRateBPS() {
if( max_download_rate_bps == UNLIMITED_RATE ) return 0;
return max_download_rate_bps;
}
public void initialize() {
AzureusCoreFactory.getSingleton().getGlobalManager().addListener( new GlobalManagerListener() {
public void downloadManagerAdded( DownloadManager dm ){}
public void downloadManagerRemoved( DownloadManager dm ){}
public void destroyInitiated(){}
public void destroyed(){}
public void seedingStatusChanged( boolean seeding_only ) {
seeding_only_mode = seeding_only;
refreshRates();
}
});
}
/**
* Get the singleton instance of the network manager.
* @return the network manager
*/
public static NetworkManager getSingleton() { return instance; }
/**
* Create a new unconnected remote network connection (for outbound-initiated connections).
* @param remote_address to connect to
* @param encoder default message stream encoder to use for the outgoing queue
* @param decoder default message stream decoder to use for the incoming queue
* @return a new connection
*/
public NetworkConnection createConnection( InetSocketAddress remote_address, MessageStreamEncoder encoder, MessageStreamDecoder decoder, boolean connect_with_crypto, boolean allow_fallback, byte[] shared_secret ) {
return NetworkConnectionFactory.create( remote_address, encoder, decoder, connect_with_crypto, allow_fallback, shared_secret );
}
/**
* Request the acceptance and routing of new incoming connections that match the given initial byte sequence.
* @param matcher initial byte sequence used for routing
* @param listener for handling new inbound connections
* @param factory to use for creating default stream encoder/decoders
*/
public void requestIncomingConnectionRouting( ByteMatcher matcher, final RoutingListener listener, final MessageStreamFactory factory ) {
incoming_socketchannel_manager.registerMatchBytes( matcher, new IncomingSocketChannelManager.MatchListener() {
public boolean
autoCryptoFallback()
{
return( listener.autoCryptoFallback());
}
public void connectionMatched( TCPTransportHelperFilter filter, ByteBuffer read_so_far ) {
listener.connectionRouted( NetworkConnectionFactory.create( filter, read_so_far, factory.createEncoder(), factory.createDecoder() ) );
}
});
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -