Netzwerkprogrammierung Socket im LAN schnell, von extern extrem langsam

marcel_h

Grünschnabel
Hallo,

ich wäre euch dankbar wenn ihr mir einen Tip geben könntet. Ich betreibe eine Client/Server Kommunikation über Sockets. Im LAN läuft das Ganze richtig performant, ermögliche ich aber einem externen Client die Kommunikation über NAT geht der Durchsatz total krachen. Für eine 70MB Datei benötigt er eine anderthalbe Stunde.

Ich habe jetzt schon so ziemlich alles probiert und bin mittlerweile an dem Punkt angekommen an dem ich den NATenden Rechner verdächtige. Habt ihr noch eine Idee für mich die ich verfolgen kann?

Schnipsel Server:
Code:
  public void run() {
    try {
      ServerSocketFactory srvFact;

      if(withssl){
        srvFact = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
      } else {
        srvFact = ServerSocketFactory.getDefault();
      }
      ServerSocket sock = srvFact.createServerSocket(port);
      while (true) {
          try {
            Socket s = sock.accept();
            s.setTcpNoDelay(true);

            ObjectStreamProcess p = new ObjectStreamProcess(pdm, s, mode);
            p.start();
          }
          catch (Exception ee) {
            ee.printStackTrace();
          }
        }
    } catch (Exception ee) {
      ee.printStackTrace();
    }
  }

Der ObjectStreamProcess mapt eingehende Objekte um und connectiert auf einen RMI-Server, ich weiss das die Serialisierung nicht gerade das Schnellste ist, aber wie gesagt, im LAN läuft es recht flott.

ClientSchnipsel:
Code:
  public void connect(String _host, int _port, int _mode) throws Exception {
    this.host = _host;
    this.port = _port;
    this.mode = _mode;
    if(mode <2) {
      connection = new Socket(_host, _port);
      System.out.println(connection);
    } else {
      SSLSocketFactory sslFact =(SSLSocketFactory)SSLSocketFactory.getDefault();
      connection = (SSLSocket)sslFact.createSocket(host, port);
      System.out.println("connection: "+connection);
    }
    connection.setTcpNoDelay(true);
  }

Grüße Marcel
 
Servus!

Kann es sein, dass ihr für eure externen Verbindungen einen ganz normalen Internetanschluss benutzt bzw. die Gegenstelle einen solchen nutzt?
Dann würde sich nämlich die langsamere Verbdinung dadurch äußern, dass der uploadende Rechner halt nich mehr asl 15KByte/s kann.
 
Hi Hacky,

danke für deine Antwort. Genau das war ja auch meine Vermutung, habe das bis jetzt immer etwas ausser Acht gelassen. Wir hängen hier an einer Standleitung und ich habe die externen Tests immer auf die lahme Leitung geschoben. Jetzt geht der Spaß langsam produktiv und ich habe daheim mit DSL getestet. Zwar mit begrenztem Upload aber der Download ist genauso langsam. :(

Im Moment sucht der Client sich seinen LocalPort automatisch, ob es etwas bringt ihn manuell zu erzwingen?

Grüße Marcel
 
Hmm, ich denke mal, dass dies nichts bringen würde. Es könnte natürlich sein, dass deine Firma den Upload manuell begrenzt und deshalb die Daten bei Dir so langsam ankommen. Denn irgendwie kann ich dies nicht mit einen Programmierfehler verbinden, weil ja die Kommunikation im LAN und WAN identisch ist.
 
Ich bin immer noch fleissig am probieren. :(

Ich habe jetzt auf beiden Sockets die:

s.setReceiveBufferSize(8*1024);
s.setSendBufferSize(8*1024);

gesetzt und ich hatte noch einen ungepufferten Stream drin. Leider ist es dadurch nur marginal besser geworden, so langsam bin ich mit meinem Latein am Ende. Ich habe jetzt etwas mit:

public void setPerformancePreferences(int connectionTime,
int latency,
int bandwidth)

gespielt aber die Änderungen dort interessieren ihn wie die letzte Wasserstandsmeldung. :(

Grüße Marcel
 
Zurück