2014-05-11 7 views
-3

Java에서 쓰레드가 어떻게 동작하는지 알았을 때, 나는 틀렸어.이 서버가 클라이언트를 청취하고 동시에 콘솔에 텍스트를 입력 할 수있게하고 싶다.자바의 쓰레드와 서버

public class MultiThreadChatServerSync implements Runnable{ 

    private static ServerSocket serverSocket = null; 
    private static Socket clientSocket = null; 
    private static final int maxClientsCount = 10; 
    private static final clientThread[] threads = new clientThread[maxClientsCount]; 

    public static void main(String args[]) { 
     int portNumber = 2222; 
     if (args.length < 1) { 
      System.out.println("Usage<portNumber>\n"); 

     } else { 
      portNumber = Integer.valueOf(args[0]).intValue(); 
     } 

     try { 
      serverSocket = new ServerSocket(portNumber); 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
     //I thought this was the answer and it would run in the backround 
     (new Thread(new MultiThreadChatServerSync())).start(); 


    } 
    public void run() { 

     while (true) { 
      try { 
       clientSocket = serverSocket.accept(); 
       int i = 0; 
       for (i = 0; i < maxClientsCount; i++) { 
        if (threads[i] == null) { 
         (threads[i] = new clientThread(clientSocket, threads)).start(); 
         break; 
        } 
       } 
       if (i == maxClientsCount) { 
        PrintStream os = new PrintStream(clientSocket.getOutputStream()); 
        os.println("Server too busy. Try later."); 
        os.close(); 
        clientSocket.close(); 
       } 
      } catch (IOException e) { 
       System.out.println(e); 
      } 
     } 

    } 
} 

Please. 나는 무엇이 있습니까?

+0

질문을 반복하지 마십시오. 답을 얻는 데 도움이되지 않습니다. 도움이되는 답을 얻지 못하면 원래 질문을 편집하여 필요한 내용을 명확히하십시오. –

+0

@Don Roby. 사과드립니다. 다음 번에 그렇게 할 것입니다. 내가 무엇을 놓치고 있는지 알지 못하고 그것을 얻기 위해 열심히 노력했지만 그럴 수는 없습니다. – user2893681

답변

0

질문은 명확하지 않지만 콘솔에서 사용자 입력을 받아들이는 동안 주 스레드에서 서버를 실행하고 있다는 것이 좋습니다. 사용자 입력을 받아들이 길 원한다면 다른 스레드가 유일한 목적은 들어오는 연결을 수신하고 받아들이는 것입니다.

즉 당신이보고있는 건축물의 종류가 있어야한다 (의사 코드)

서버 스레드 :

public void run() { 
    while (connections < maxConnections) { 
     conn = accept connection 

     // pass the new connection to a seperate thread 
     sht = new ServerHelperThread(conn) 
     sht.start() 
     connections++ 
    } 
} 

개별 클라이언트 처리하는 서버 도우미 스레드 :

public ServerHelperThread(conn) { 
    this.conn = conn; 
} 

public void run() { 
    while(some condition) { 
     communicate with client 
    } 
    conn.close() 
} 

주류 :

public static void main(String[] args) { 
    new ServerThread().start 
    accept input from the console 
} 
+0

맞습니다. 내 질문은 꽤 모호했다. 나는 클라이언트 스크립트를 가지고 있으며 서버와 통신 할 수있다. 문제는 아니다. 내 문제는이 "clientSocket = serverSocket.accept();"이다. 어떤 입력을 입력하고 나는 모든 클라이언트에 연결된 메시지를 보내도록 서버에 입력을 입력하고 싶습니다. 내가 만들려고했던 스레드는 백그라운드에서 클라이언트를 청취하고 "서버 콘솔 "나는 아직도 막연한 지 알려주겠습니다. 감사합니다. – user2893681

+0

보낼 메시지는 무엇입니까? 가능한 경우 좀 더 자세한 내용을 알려주십시오. – james

+0

클라이언트가 서로 메시지를주고받을 수있는 클라이언트 스크립트가 있습니다. 그러나 나는 더 많은 재능을 원합니다. 1) 연결된 클라이언트에게 메시지를 보내기 위해 연결을 기다리는 동안 서버에 입력 할 수 있어야합니다 (관리자라고도 함). 2) 문제점 : 서버가 수신 대기 중입니다. 입력을받을 수 없습니다 (메시지를 쓸 수 없음). 3) 서버가 backround에서 클라이언트를 받아들이도록하고 싶습니다.이 줄은 "clientSocket = serverSocket.accept();"입니다. 내 입력을 차단하기 때문에 콘솔이 아닌 백그라운드에서 발생해야합니다. – user2893681