2017-06-13 1 views
2

皆さん。 私は2つのスレッドを持っていますが、これはクライアントからの接続を処理することが任されています。whileループで2つのサーバースレッドが互いにブロックしています

私は、サーバーがブロックし、動作を停止し、クライアントをブロックするが、私はこれを削除した場合、この現象が発生しないだろう、loginSocketに2回接続しようとするとこれは私のコード

ServerSocket loginSocket = new ServerSocket(8000); 
ServerSocket fileSocket = new ServerSocket(7000); 

while (running) { 
    new LoginThread(loginSocket.accept(),loginInormation).start(); 
    new LoaderThread(fileSocket.accept()).start(); 
} 

です:

new LoginThread(loginSocket.accept(),loginInormation).start(); 

エラーメッセージが表示されないのはなぜですか。これがどうして起こりますか?これをどのように修正できますか?

+0

'loginSocket.accept()'、おそらく接続を待っていますか? –

+0

私はこれを見ました:https://stackoverflow.com/questions/10131377/socket-programming-multiple-client-to-one-serverそして私はあなたが間違っている場所を見ません。私はもっ​​とコードが必要だと思います。たとえば、 'LoginThread'と' LoaderThread'には何が入っていますか?また、あなたは静かに例外をキャッチしていないと確信していますか? –

答えて

0

accept()メソッドはブロックメソッドです。つまり、loginSocket()で接続するまでプログラムが続行されません。

LoginThreadを作成するとき、プログラムは接続を待ってオブジェクトの最初のパラメータを設定し、接続が確立されるまで実行を継続しません。

0

new LoginThread(loginSocket.accept(),loginInormation).start();には、このスレッドが作成される前に呼び出されるloginSocket.accept()というメソッド呼び出しが含まれています。このメソッド呼び出しは、クライアントがログインするまでブロックされます(さらに、2番目のスレッドはfileSocket.accept()によってブロックされます)。

解決策としては、accept()呼び出しを各スレッドの内部に移動します。これを行うには、ソケットにスレッドを渡す必要があります。

0
異なるスレッドで

スタートfileSocketとログインソケット

package com.ca.training.task.app; 

import java.io.IOException; 
import java.net.ServerSocket; 

public class App { 

    public void execute() { 
     LoginRunnable loginRunnable = new LoginRunnable(); 
     loginRunnable.setLoginInformation(new Object());//Login information 

     FileRunnable fileRunnable = new FileRunnable();//Data for loaded runnable. 
     fileRunnable.setParams(new Object()); 

     startLoginThread(loginRunnable); 
     startFileThread(fileRunnable); 
    } 

    private static void startLoginThread(LoginRunnable loginRunnable) { 
     Thread loginThread = new Thread(loginRunnable); 
     loginThread.start(); 
    } 

    private static void startFileThread(FileRunnable fileRunnable) { 
     Thread loadedThread = new Thread(fileRunnable); 
     loadedThread.start(); 
    } 

    class LoginRunnable implements Runnable { 

     private Object loginInformation; 

     @Override 
     public void run() { 
      try { 
       ServerSocket loginSocket = new ServerSocket(8000); 
       loginSocket.accept(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     public Object getLoginInformation() { 
      return loginInformation; 
     } 

     public void setLoginInformation(Object loginInformation) { 
      this.loginInformation = loginInformation; 
     } 
    } 

    class FileRunnable implements Runnable { 

     private Object params; 

     @Override 
     public void run() { 
      try { 
       ServerSocket fileSocket = new ServerSocket(7000); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     public Object getParams() { 
      return params; 
     } 

     public void setParams(Object params) { 
      this.params = params; 
     } 
    } 
} 
関連する問題