2011-01-14 13 views
0

を受け入れる:ServerSocketのは、私は次のコードスニペット持って行動

if (servsock == null) { 
    System.out.println("HELLO1!"); 
    servsock = new ServerSocket(63456, 10); 
    System.out.println("HELLO2!"); 
} 
try { 
    System.out.println("HELLO3!"); 
    sock = servsock.accept(); 
} catch (Exception ex) { 
    if (servsock != null && !servsock.isClosed()) { 
     System.out.println("PICO1!"); 
     servsock.close(); 
    } 
    if (servsock != null && servsock.isClosed()) { 
     System.out.println("PICO2!"); 
     manager.log("SERVER SOCKET closed and nulled."); 
     servsock = null; 
    } 
    sock = servsock.accept(); 
} 
System.out.println("HELLO4!"); 
is = sock.getInputStream(); 
System.out.println("HELLO5!"); 
bis = new BufferedInputStream(is); 
System.out.println("HELLO6!"); 

にこのコードを実行可能なのrun()方法で実行され、ファイルが転送されたとき、すべての通信を停止することになっています。

好奇心は、ループではないということです。コードは受け入れますが、ファイル転送を行いますが、なぜHELLO1が私の画面に再び表示されるのか分かりません。したがって、このコードをもう一度実行しようとすると、「接続が拒否されました」というメッセージが表示されます。

「10」は私のハックでしたが、元のコードではバックログも使用しませんでした。

お願いします。

以前を実行する実行しているコードがあることである:正確な問題は、今私は新しいServerSocketを(63456)コマンドに達したときに、クライアントが「接続拒否」を取得しますが、そのプログラムを、ある

final IClientInterface clientInterface = client.getClient(); 
final prgHolder = new ProgHolder(); 
Pong ftppong = new Pong(); 
ftppong.setFileNames(bout64.toByteArray()); 
ftppong.setDstFolder(dstFolder); 
prgHolder.setName("pong"); 
prgHolder.setTask(pong); 
Thread t = new Thread(new Runnable() { 
    public void run() { 
     try { 
      IClientInterface.execute(prgHolder); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
}); 
t.start(); 

離れたPCで、広く開いて幅広いリスナーです! "netstat"はそれを確認します!

私は別のウィンドウからプログラムを再実行し、すべてのHELLOメッセージを渡してジョブを完了させます。

スレッドは遠いPCで停止し、ポート63456をバインド解除します!

なぜコードとして失敗しますが、着信要求を受け入れますか?

+0

私はエラーの正確な箇所を発見しました。それはスレッドの後です。 t.start()の後に。私はこれを行う場所: "Socket sock = new Socket(" distantmaching "、63456);コードがちょうどそこにぶら下がっていますスレッドの直後です。理論によると、私はサーバスレッドをセットアップしクライアントがその接続を取得する必要があります小さなスニペット、右?それは動作していないようです。 – hephestos

+0

windows windows:問題ありません。サーバーを接続とし​​て受け入れるためのサーバーとして失敗します。 – hephestos

答えて

1

このコードに基づいて、HELLO1は1回だけ表示されます。ただし、このコードの呼び出し元がループしている可能性が高い場合は、以前のservsockの値をチェックする点がありません。

これは何をする予定ですか?

servsock = null; 
} 
sock = servsock.accept(); 

例外が発生した場合、発生しなかったかのように続行しないでください。

コードが何をしているのかを理解したい場合は、デバッガを使用してコードをステップ実行することをお勧めします。

+0

この問題が発生した後、デバッガとループについてのポイントがありますが、ループはありませんrunnableクラス全体がrun()に入れられ、このスレッドのようにThreadから呼び出されます。t = new Thread(Runnable); t.start (); HELLO1 ... 2 ... 3 ...完璧な.... 1mgループについて私は再確認します。 – hephestos

関連する問題