2016-11-13 6 views
0

サーバーに接続してメッセージを送信するクライアントを構築中です。私はその部分がダウンしている、サーバーがメッセージを取得しているが、私の問題は、クライアントがサーバーからのメッセージを聞くことです。基本的にはチャットルームのようなもので、サーバーにメッセージを送信する必要があります。また、クライアントはサーバーからメッセージを受信し、サーバーから送信されたメッセージを印刷する必要があります。スレッドとソケットを使用してサーバーの応答を取得する

私はサーバーを構築していないか、サーバーコードにアクセスできませんでしたが、サーバーが動作していることはわかります。私はクライアントのために何を持っているのですか?SendThreadは正常に動作していますが、GetThreadを追加すると送信スレッドは機能しなくなり、2スレッド、1リスン、1送信ができなくなります。

Client.java

public class Client { 
    public static void main(String[] args) throws IOException { 

     // String name = args[0]; 
     String name = "Brandon"; 
     Socket socket = new Socket("localhost", 4688); 
     Thread sendThread = new SendThread(socket, name); 
     Thread getThread = new GetThread(socket); 
     sendThread.start(); 
     getThread.start(); 
    } 
} 

SendThread.java

public class SendThread extends Thread { 
    Socket socket; 
    String name; 
    SendThread(Socket s, String n) { 
     socket = s; 
     this.name = n; 
    } 

    public void run(){ 
     try{ 
      String message; 
      PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
      printWriter.println("connect Brandon"); 
      BufferedReader bufferedReaderFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      System.out.println(bufferedReaderFromClient.readLine()); 
      BufferedReader bufferedReader = new java.io.BufferedReader(new InputStreamReader(System.in)); 
      while(true) { 
       String readerInput = bufferedReader.readLine(); 
       printWriter.println(name + ": " + readerInput); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

GetThread.java

public class GetThread extends Thread { 
    Socket socket; 

    GetThread(Socket s) { 
     socket = s; 
    } 

    public void run(){ 
     try{ 
      String message; 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      while((message = bufferedReader.readLine()) != null) { 
       System.out.println("Incoming: " + message); 
      } 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+0

を –

+0

どこかときに、各スレッドがスタックになるん..私はちょうど両方のスレッドがアクティブに取得することはできません? – acelent

+0

ソケットとスレッドについて読むhttp://www.oracle.com/technetwork/java/socket-140484.html#multi –

答えて

1

CRはいけません二番目の数字はBufferedReaderです。ソケットの寿命は同じものを使用してください。最初の読者がすでにバッファしているデータが失われています。

readLine()がnullを返す場合は、読み取りループを中断する必要があります。

+0

ありがとうございました....両方とも同じBufferedReaderを使用するにはどうすればよいですか?クライアントでインスタンス化すると、スレッド –

+0

Sighでアクセスできません。同じ 'run()'メソッドで2つの 'BufferedReaders'をインスタンス化しています。あなた自身のコードを説明する必要はありません。送信スレッドでも入力していますが、別の受信スレッドを持っていても意味がありません。あなたはここに戻って、ここで何を達成しようとしているのか考える必要があります。 – EJP

-1

競合状態に見えます。メッセージが送信されるまでreadLine()がブロックされ、そのときにGetThreadまたはSendThreadがそれを取得し、もう一方を待機させます。あなたは並行性の問題を回避するために、両方のスレッドでメッセージを、必要な場合は、モニターを検討する必要があります。両方のスレッドが動作するように見えます

public class Monitor { 
    private String msg; 
    private boolean hasMsg = false; 

    public synchronized void newMsg(String msg) { 
     this.msg = msg; 
     hasMsg = true; 
     notifyAll(); 
    } 

    public synchronized String getMsg() { 
     try { 
      while (!hasMsg) wait(); 
     } catch (InterruptedException e) {}; 

     hasMsg = false; 
     return msg; 
    } 
} 

public class Client { 
    // ... 
    Monitor m = new Monitor(); 
    Thread sendThread = new SendThread(m, socket, name); 
    Thread getThread = new GetThread(m, socket); 
    // ... 
} 

public class GetThread extends Thread { 
    private Monitor monitor; 
    private Socket socket; 
    public GetThread(Monitor m, Socket s) { 
     monitor = m; 
     socket = s; 
    } 

    public void run() { 
     // ... 
     while((message = bufferedReader.readLine()) != null) { 
      monitor.newMsg(message); 
      System.out.println("Incoming: "+message); 
     } 
     // ... 
    } 
} 

public class SendThread extends Thread { 
    private Socket socket; 
    private Monitor monitor; 
    private String name; 
    public SendThread(Monitor m, Socket s, String n) { 
     monitor = m; 
     socket = s; 
     name = n; 
    } 

    public void run() { 
     // ... 
     String readerInput = monitor.getMsg(); 
     printWriter.println(name + ": "+readerInput); 
     // ... 
    } 
} 
+0

私は独自のクラスでモニタを追加しました....各クラスのトップにあるモニタを呼び出して(スレッドを送信して取得します)、サーバからのリスニングのみを行います...サーバに送信することはできません私はここで間違って何をしているのかわからない! –

+0

SendThreadとGetThreadの両方には、Monitorオブジェクトの同じインスタンスが必要です。通常、まずMonitorオブジェクトを作成し、それを必要とするスレッドに渡します。 – Lidae

関連する問題