📄 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 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.networkmanager.impl.http.HTTPNetworkManager;
import com.aelitis.azureus.core.networkmanager.impl.tcp.TCPNetworkManager;
import com.aelitis.azureus.core.networkmanager.impl.udp.UDPNetworkManager;
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();
private static int max_download_rate_bps;
private static int max_upload_rate_bps_normal;
private static int max_upload_rate_bps_seeding_only;
private static int max_upload_rate_bps;
private static boolean lan_rate_enabled;
private static int max_lan_upload_rate_bps;
private static int max_lan_download_rate_bps;
private static boolean seeding_only_mode_allowed;
private 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",
"LAN Speed Enabled",
"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",
"network.udp.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;
lan_rate_enabled = COConfigurationManager.getBooleanParameter("LAN Speed Enabled");
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;
refreshRates();
}
});
}
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() {
}
public static int getMinMssSize() { return Math.min( TCPNetworkManager.getTcpMssSize(), UDPNetworkManager.getUdpMssSize()); }
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
int min_rate = Math.min( max_upload_rate_bps,
Math.min( max_download_rate_bps,
Math.min( max_lan_upload_rate_bps, max_lan_download_rate_bps )));
TCPNetworkManager.refreshRates( min_rate );
UDPNetworkManager.refreshRates( min_rate );
}
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() {
HTTPNetworkManager.getSingleton();
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
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -