2016-06-19 5 views
0

クライアントがサーバーに単純な文字列を送り、サーバーに接続された各クライアントがこのStringを取得するJavaでクライアント/サーバープログラムを作成しようとしています。 私は、各クライアントのための新しいスレッドを作成し、それらを聞くサーバーの2つのサーバークラスを作成しました。また、クライアントソケットのリストもあります。クライアントの1人が送信した文字列を各クライアントに送信するために使用したいと思います。私はそのためにforeachループを使用します。ソケットのDataOutputStreamをソケットリストのループに入れることができません

public void run(){ 
    try{ 
     while(true){ 
      String data = in.readUTF(); 
      for(Socket soc : GlobalQdaServer.allClients){ 
       DataOutputStream sOut = new DataOutputStream(soc.getOutputStream()); 
       sOut.writeUTF(data + ". Total clients number in list: " + GlobalQdaServer.allClients.size()); 
      }     
     } 
    } 
    catch(EOFException ex){ 
     System.out.println(ex.getMessage()); 
    } 
    catch(IOException ex){ 
     System.out.println(ex.getMessage()); 
    } 
} 

だから、これだけのクライアントが(それは自分自身を送信した)文字列をrecieves:しかし、私は唯一のサーバに文字列を送信したクライアントのためにDataOutputStreamのです。他は何も受け取りません。 これらは完全なクラスです:

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.EOFException; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.*; 
import java.util.ArrayList; 
import java.util.List; 


public class GlobalQdaServer { 
    public static List<Socket> allClients = new ArrayList<Socket>(); 

    public static void main(String[] args) { 
     try{ 
      int serverPort = 7896; 
      ServerSocket listenSocket = new ServerSocket(serverPort); 
      while(true){ 
       Socket clientSocket = listenSocket.accept(); 
       allClients.add(clientSocket); 
       Connection c = new Connection(clientSocket); 
      } 
     } 
     catch(IOException ex){ 
      System.out.println("Server Socket creating failiure");    
     } 
    } 

} 

class Connection extends Thread{ 
    DataInputStream in; 
    DataOutputStream out; 
    Socket clientSocket; 
    public Connection(Socket aClientSocket){ 
     try{ 
      clientSocket = aClientSocket; 
      in = new DataInputStream(clientSocket.getInputStream()); 
      out = new DataOutputStream(clientSocket.getOutputStream()); 
      this.start(); 
     } 
     catch(IOException ex){ 
      System.out.println(ex.getMessage()); 
     }   
    } 

    public void run(){ 
     try{ 
      while(true){ 
       String data = in.readUTF(); 
       for(Socket soc : GlobalQdaServer.allClients){ 
        DataOutputStream sOut = new DataOutputStream(soc.getOutputStream()); 
        sOut.writeUTF(data + ". Total clients number in list: " + GlobalQdaServer.allClients.size()); 
       }     
      } 
     } 
     catch(EOFException ex){ 
      System.out.println(ex.getMessage()); 
     } 
     catch(IOException ex){ 
      System.out.println(ex.getMessage()); 
     } 
    } 
} 


    import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.EOFException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.*; 


public class GlobalQdaClient { 

    public static void main(String[] args) throws IOException { 
     int serverPort = 7896; 
     Socket s = new Socket("localhost", serverPort); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
     String input = ""; 
     while(!input.equals("end")){ 
      input = reader.readLine(); 
      try{ 
       DataInputStream in = new DataInputStream(s.getInputStream()); 
       DataOutputStream out = new DataOutputStream(s.getOutputStream()); 
       out.writeUTF(input); 
       String data = in.readUTF(); 
       System.out.println("Recieved this: " + data);    
      } 
      catch(UnknownHostException ex){ 
       System.out.println(ex.getMessage()); 
      } 
      catch(EOFException ex){ 
       System.out.println(ex.getMessage()); 
      } 
      catch(IOException ex){ 
       System.out.println(ex.getMessage()); 
      } 
     } 
    }  
} 

、問題のコースを見つけて助けてください。私はソケットには新しいです。ありがとうございます

答えて

1

あなたのプログラムは実際にうまくいきます。

唯一の問題は、continuos読み取りでクライアントをブロックしていることです。

他のクライアントが読んでからブロックを解除した後、実際にあなたが送信したメッセージが表示されます。

は、以下のことを試してみてください。

  • 実行サーバー
  • 実行クライアント1
  • を実行し、クライアント2
  • は、(クライアント2が今あるため、入力のブロックされていることに注意してください)
  • からメッセージを送信クライアント1からメッセージを送信しますクライアント2

以前にclient2のclient1から送信されたssage。

しかし、一度送信したメッセージを両方のクライアントで受信する必要がある場合は、更新を連続的に取得するために別のスレッドを作成する必要があります。

私はあなたのクライアントを変更しました。

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.EOFException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 


public class GlobalQdaClient extends Thread { 
     int serverPort = 7896; 
     BufferedReader reader ; 
     static String input = ""; 
     Socket s; 
     DataInputStream in ; 
     DataOutputStream out ; 
public GlobalQdaClient() { 
     try { 
      reader = new BufferedReader(new InputStreamReader(System.in)); 
      s = new Socket("localhost", serverPort); 
      in = new DataInputStream(s.getInputStream()); 
      out = new DataOutputStream(s.getOutputStream()); 
     } catch (IOException ex) { 
      Logger.getLogger(GlobalQdaClient.class.getName()).log(Level.SEVERE, null, ex); 
     } 
} 

public static void main(String[] args) throws IOException { 
    GlobalQdaClient client = new GlobalQdaClient(); 
    client.start(); 
    while(!client.input.equals("end")){ 
     client.input = client.reader.readLine(); 
     try{ 
      client.out.writeUTF(client.input); 
      if(client.in.available()>0){ 
      String data = client.in.readUTF(); 
      System.out.println("Recieved this: " + data);    
      } 
     } 
     catch(UnknownHostException ex){ 
      System.out.println(ex.getMessage()); 
     } 
     catch(EOFException ex){ 
      System.out.println(ex.getMessage()); 
     } 
     catch(IOException ex){ 
      System.out.println(ex.getMessage()); 
     } 
    } 
}  

@Override 
public void run(){ 

    try { 
     while(true){ 
      String data = in.readUTF(); 
      System.out.println("Recieved this: " + data);    
      }  
    } catch (IOException ex) { 
      Logger.getLogger(Message.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 
+0

ありがとうございます。あなたが書いたように私はやろうとしました。しかし、クライアント2はクライアント1から送信されたメッセージを受信せず、クライアント1はクライアント2から送信されたメッセージを受信しませんでした。 –

+0

オハイオ州、オクラホマ、私は以前のメッセージがクライアントによって得られていることを知りました...しかし、ちょうど奇妙な順序の1つまたは別のクライアントからのメッセージの1つにつき。しかし、クライアントがブロックされないようにするにはどうすればよいですか? –

+0

それは即座に受信されません、あなたからのメッセージを送信して、他のクライアントのブロックを解除する必要があります。 クライアント1から送信しようとすると、まだブロックされていないクライアント2には何も表示されませんが、クライアント2に行きメッセージを送信すると、クライアント2にアレックスメッセージが表示されます。 –

関連する問題