2016-06-19 2 views
0

클라이언트가 서버에 간단한 문자열을 보내고 서버에 연결된 각 클라이언트가이 문자열을받는 Java 클라이언트/서버 프로그램을 만들려고합니다. 그래서 각 클라이언트에 대해 새 스레드를 만들고이를 수신하는 서버에 대해 2 개의 서버 클래스를 만들었습니다. 또한 클라이언트 소켓 목록이 있습니다. 각 클라이언트에 클라이언트 중 하나가 보낸 문자열을 보내고 싶습니다. 내가 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()); 
    } 
} 

그래서 만이 클라이언트가 (그 자체를 전송하는) 문자열을 접수에 :하지만 난 단지 서버에 문자열을 보낸 클라이언트에 대한 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

프로그램이 실제로 정상적으로 작동합니다.

유일한 문제는 연속 읽기로 클라이언트를 차단하고 있다는 것입니다.

다른 클라이언트가 읽지 않은 상태에서 보낸 메시지를 실제로 볼 수 있습니다.

보십시오 다음 :

  • 실행 서버
  • 실행 클라이언트 1
  • 실행 클라이언트 2
  • 클라이언트 1에서 메시지 보내기
  • 메시지 보내기에서 (클라이언트 2는 이제 때문에 입력으로 차단되어 있습니다) 클라이언트 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 개당. 그러나 클라이언트가 차단되지 않도록하려면 어떻게해야합니까 ?? –

+0

즉시 수신되지 않습니다. 다른 클라이언트의 메시지를 보내 다른 클라이언트의 차단을 해제해야합니다. Alexey 님이 보낸 메일을 보내려고하면 아무 것도 나타나지 않습니다. 그러나 client2로 가서 메시지를 보내면 알렉스 메시지가 client2에 표시됩니다. –

관련 문제