2017-03-26 3 views
1

私は初心者のJavaネットワークプログラミングですので、心に留めておいてください。サーバクライアントコミュニケーションフリーズ[コマンドプロンプト]

私はマルチスレッドのJavaサーバークライアントアプリケーションを開発しようとしています。初心者のために、私は単一のクライアントとサーバーの間の通信チャネルを開発することを目指しています。スレッドを使わないと、単一のクライアント/サーバー間の通信は正常に動作します。私がスレッドを適用すると、プログラムが失敗します。メッセージは送信されていません。

MyServer.java

class MyServer { 
public static void main(String[] args) { 
    try { 
     ServerSocket svc = new ServerSocket(4567); 
     System.out.println("Server Waiting at Port 4567"); 
     do { 
      Socket sock = svc.accept(); 
      MyServerThread thread = new MyServerThread(sock); 
     }while(true); 

    } 
    catch(UnknownHostException ex) { 
     System.out.println("Unknown Host"); 
    } 
    catch(IOException ex) { 
     System.out.println("IO Exception"); 
    } 
} 
} 

MyServerThread.java

class MyServerThread extends Thread{ 

Socket sock; 

public MyServerThread(Socket sock) { 
    this.sock = sock; 
} 

public void run() { 
    try {   
     PrintWriter pw = new PrintWriter(sock.getOutputStream()); 
     Scanner cd = new Scanner(sock.getInputStream()); 
     Scanner kb = new Scanner(System.in); 

     do { 
      String clientstr = cd.nextLine(); 
      System.out.println("Client: "+clientstr); 
      if(clientstr.equalsIgnoreCase("quit")) { 
       break;   
      } 
      String str = kb.nextLine(); 
      pw.println(str); 
      pw.flush(); 
     }while(true); 
     sock.close(); 
     pw.close(); 
    } 
    catch(UnknownHostException ex) { 
     System.out.println("Unknown Host"); 
    } 
    catch(IOException ex) { 
     System.out.println("IO Exception"); 
    } 
}  
} 

MyClientという

class MyClient3 { 

public static void main(String[] args) { 
    try { 
     InetAddress object = InetAddress.getByName("192.168.18.125"); 
     Socket sock = new Socket(object, 4567); 

     PrintWriter pw = new PrintWriter(sock.getOutputStream()); 
     Scanner cd = new Scanner(sock.getInputStream()); 
     Scanner kb = new Scanner(System.in);  

     do { 
      String str = kb.nextLine(); 
      pw.println(str); 
      pw.flush(); 
      String strserver = cd.nextLine(); 
      System.out.println("Server: "+strserver); 
      if(strserver.equalsIgnoreCase("quit")) { 
       break; 
      } 
     }while(true); 
     sock.close(); 
     pw.close(); 
    } 
    catch(UnknownHostException ex) { 
     System.out.println("Unknown Host"); 
    } 
    catch(IOException ex) { 
     System.out.println("IO Exception"); 
    } 
} 
} 
+1

マルチスレッドのクライアントサーバープログラムを作成するときは、このコードは正しくありません。複数のクライアントがサーバーに接続する場合は、IDを割り当てなければなりません。 1,2,3,4などを各クライアントに提供しています。詳細はこちら[link](http://mrbool.com/creating-a-multithreaded-chat-with-socket-in-java/34275) –

答えて

1

あなたの最もimmedia問題はMyServerThreadの作成後にスレッド上でThread#start()を呼び出さないということです。しかし、通常はスレッドを拡張するクラスを作成すべきではありません。代わりにRunnableを作成し、それをThread#new(Runnable)に渡す必要があります。