2012-02-17 21 views
0

私は入力としてサーバ名、ポート、スレッド数、および要求するファイル名を入力するマルチスレッドサーバを作成しています。私の設計はソケットを作成することですmainを通してRunnableオブジェクト(ソケットとファイル名を取ります)を拡張します。また、5秒が過ぎると起動し、すべてのスレッドを閉じて終了するtimertaskを持っています。現在の設計はソケットを作成することですメインでは、それをrunnableに渡します(条件xにwhileループがあり、何度もファイルを要求しています)。タスクが起動すると、runnableのプライベート共有変数xがfalseに設定されます。javaのマルチスレッドサーバ..ファイルを扱うスレッド

私は、私のデザインに欠陥があると信じさせる多くの破損したパイプの問題に直面しています。何か不足していますか?同期/ロックされた変数を使用していません。すべてのファイル要求に対して新しいソケットを作成する必要がありますか?

スタックトレース:

java.net.SocketException: Broken pipe 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:115) 
    at java.io.DataOutputStream.writeBytes(DataOutputStream.java:259) 
    at FR.filesRecv(Client.java:62) 
    at FR.run(Client.java:79) 
    at java.lang.Thread.run(Thread.java:637) 
+0

サーバー側とクライアント側はちょっと混乱します。あなたの質問を編集してこれをもっと明確にすることはできますか? – Gray

+0

また、どのような種類の「壊れたパイプの問題」がありますか。 stacktrace行の一部の例外は、あなたの質問の終わりに置くのには常に良いアイデアです。 – Gray

+0

クライアントはサーバにバイトを書き込んでいますか?パイプが壊れている場合は、サーバーが接続を閉じたように見えます。 – Gray

答えて

1

いくつかの一般的なコメント:

  • はい、各クライアントがサーバに、独自のソケット接続が必要です。
  • サーバー側にはサーバーソケットがありますが、クライアントからの接続が受け入れられると、各ハンドラーが対応するクライアントと通信するための新しいソケットが作成されます。
  • 私はmainにスレッドをフォークしてから5秒間スリープして、runnable変数をfalseに設定します。タイマータスクの必要はありません。
  • JVMをすばやく停止させる場合は、mainからすぐに終了するか、それぞれのスレッドでjoin()を呼び出して適切に終了するようにすることができます。スレッドが開始する前にthread.setDaemon(false);を設定してからmainを終了すると、スレッドが終了するまでJVMは停止しません。
  • runnable変数が別のスレッドから設定される場合は、volatileであることを確認する必要があります。
+0

グレイありがとう!これは素晴らしい情報です。 –

+0

グレー:私はまだ壊れたパイプ(私はスレッドを開始した後私のメインスレッドでThread.sleep(5 * 1000L)を呼び出す)..私はデバッグ目的のためだけに1つのスレッドを産み出し、それは最初のファイルを取得し、破損したパイプ。 writeBytesごとに新しいソケット接続が必要か、ソケットを再利用できますか? stacktraceで質問を更新しました。 –

+0

あなたの質問に私のコメントを付けることができますか? 「サーバー側とクライアント側はちょっと分かりにくいですが、質問を編集してこれを明確にすることはできますか?」コマンドラインクライアントがファイルを要求するサーバーを作成することに言及します。それはクライアントのように聞こえる。あなたがしようとしていることを描くことはできません。 – Gray

関連する問題