2012-02-07 4 views
1

내 코드에 문제가 있습니다. 나는 연결을 기다리는 자바 서버를 만든다. 클라이언트가 연결되면 우리 (서버)가 "showinfo"명령을 보내면 cliend는 IP 주소를 다시 서버로 보냅니다.JAVA의 서버/클라이언트 프로그램 솔루션

문제는 멀티 스레드 서버이며 많은 클라이언트가 연결된다는 것입니다. 예를 들어, 2 개의 클라이언트가 서버에 연결되면 showinfo를 2 번 타이핑 한 다음 클라이언트가 정보를 제공해야합니다. 어떻게하면 클라이언트가 즉시 "showinfo"를 입력하여 응답하도록 할 수 있으며 모든 클라이언트에 대해 showinfo를 입력 할 때까지 기다리지 마십시오. 명령을 실행하기 전에 50 명의 클라이언트가있는 경우 showinfo를 50 번 입력하면 약간 지루합니다. 미리 감사합니다 (내가 어떤 스레드 동기화 및 일부 sleep()join() 명령을 시도하지만 난 당신이 좀 도와 수 있기를 바랍니다 아직 결론에 도달하지 않았습니다.) 여기

의 서버 코드

import java.io.*; 
import java.net.*; 
import java.security.*; 

public class Server implements Runnable{ 
    private Socket server; 
    private static String command,info,message; 
    BufferedReader infromclient =null; 
    InputStream infromclient2=null; 
    DataOutputStream outtoclient =null; 
    static BufferedReader infrommaster=null; 
    private static int port=6789; 

    Server(Socket server){ 
     try{  
      this.server=server; 
      infromclient =new BufferedReader(new InputStreamReader(server.getInputStream())); 
      outtoclient =new DataOutputStream(server.getOutputStream()); 
      infrommaster=new BufferedReader(new InputStreamReader(System.in)); 
     }catch(IOException e){ 
      System.out.println("Exception accessing socket streams: "+e); 
     } 
    } 

    // main() 
    // Listen for incoming connections and handle them 
    public static void main(String[] args) { 
     ThreadGroup clients = new ThreadGroup("clients"); 
     System.out.print("Waiting for connections on port " + port + "..."); 
     System.out.println("\nIn total there are:"+clients.activeCount()+" clients\n"); 
     try{ 
      ServerSocket server = new ServerSocket(port); 
      Socket nextsocket; 

      // waiting for connections 
      while(true){ 
       nextsocket = server.accept(); 
       Thread client= new Thread(clients,new Server(nextsocket),"client"+(clients.activeCount()+1)); 
       System.out.println("Client connected"); 
       System.out.println("There are "+clients.activeCount()+" clients connected"); 
       client.start();         
      } 

     }catch (IOException ioe){ 
      System.out.println("IOException on socket listen: " + ioe); 
      ioe.printStackTrace(); 
     }  
    } 

    public void run(){     
     try{        
      command=infrommaster.readLine(); 
      outtoclient.writeBytes(command+"\n"); 

      // showinfo 
      if(command.equals("showinfo")){   
       info=infromclient.readLine(); 
       System.out.println("\nClient information\n\n" +info+"\n");      
      } 

      server.close();       
     }catch (IOException ioe){ 
      System.out.println("IOException on socket listen: " + ioe); 
      ioe.printStackTrace(); 
     }  
    } 
} 

import java.io.*; 
import java.net.*; 
import java.lang.*; 


public class Client{ 

    public static void main(String args[]) throws Exception{ 
     String command2; 
     String info; 
     Socket clientSocket=null; 
     Socket scket=null;  
     BufferedReader inFromUser=null; 
     DataOutputStream outToServer=null; 
     BufferedReader inFromServer=null; 
     BufferedWriter tosite=null; 

     try{ 
      clientSocket = new Socket(InetAddress.getLocalHost().getHostName(), 6789); 
      inFromUser =new BufferedReader(new InputStreamReader(System.in)); 
      outToServer =new DataOutputStream(clientSocket.getOutputStream()); 
      inFromServer =new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));  
     }catch(UnknownHostException | IOException e){ 
      System.out.println("Problem "+e); 
     }       

     command2=inFromServer.readLine(); 
     System.out.println("From Server:" +command2); 

     // showinfo 
     if (command2.equals("showinfo")){ 
      try{ 
       InetAddress myip=InetAddress.getLocalHost(); 
       info =("IP: " +myip.getHostAddress()+"\n"); 

       System.out.println("\nSome system information\n" + info); 
       outToServer.writeBytes(info);   
      }catch (Exception e){ 
       System.out.println("Exception caught ="+e.getMessage()); 
      } 
     } 

     outToServer.flush(); 
     outToServer.close(); 
     inFromUser.close(); 
     inFromServer.close(); 
     clientSocket.close(); 
    } 
} 

이 ** 명령 clientSocket = new Socket(InetAddress.getLocalHost().getHostName(), 6789); 그것이 내 PC (포트 6789에서 내 IP)을 테스트하는 것을 의미한다 :

이곳은 클라이언트의 코드입니다.

답변

1

하나의 스레드가 readline에서 블로킹하는 경우 다른 스레드는 결국 제어권을 얻습니다. 그것이 멀티 스레딩의 요점입니다. 나는 네 문제를 안다고 생각해. 대신 입력 명령을 읽는 코드를 서버의 run() 메소드로 옮기십시오. 그럼 당신은 잘되어야합니다. 문제는 입력 폴링 후 스레드가 시작되고 있다고 생각합니다.

이동 서버의 실행하려면 서버의 생성자에서이 선() 메소드 :

infromclient =new BufferedReader(new InputStreamReader(server.getInputStream())); 
      outtoclient =new DataOutputStream(server.getOutputStream()); 
      infrommaster=new BufferedReader(new InputStreamReader(System.in)); 
+0

을 그래서 당신이 말한대로, 만약 그것의 IP를 보낼 수있는 방법을 서버에서 문자열 정보를 전송하지 않습니다 클라이언트? – user1195787

+0

클라이언트는 계속 보내지 만 사용자로부터 가져올 필요는 없습니다. – Sid

+0

사람이 코드는 내가 만드는 가장 큰 프로젝트의 작은 부분이며 클라이언트에게 명령을 내리기 위해 서버가 필요하기 때문에 사용자가 입력해야합니다. 몇 가지 동기화 명령을 시도했지만 성공한 유일한 방법은 다른 스레드가 가장 먼저 기다렸다가 두 번째 등 스레드가 작업을 종료 할 때까지 기다리는 것이 었습니다. 나는 당신에게 묻고 싶습니다. 다른 방법이 있습니다. 더 많은 프로그램을 운영하고 있습니까? 나는 멀티 태스킹/방송에 대해서도 생각해 왔지만 나는 많은 것을 알지 못한다. Btw 귀하의 답변을 주셔서 감사합니다 – user1195787