2014-01-31 76 views
0

我正在嘗試構建一個TCP服務器在接受10個客戶端的java中,每個客戶端都應該在線程中處理,以免客戶端正在等待。每個線程都會收到客戶端並讓他等待5分鐘。在Java TCP中接受多個客戶端,並讓每個客戶端等待5分鐘

這是我迄今爲止的代碼;

公共類ThreadServer {

static class ServerThread implements Runnable { 
Socket client = null; 
public ServerThread(Socket c) { 
    this.client = c; 
} 
public void run() { 
    try { 
     System.out.println("Connected to client : "+client.getInetAddress().getHostName()); 
     client.close(); 
    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
    } 
} 
} 
public static void main(String args[]) { 
    try { 
     ServerSocket server = new ServerSocket(8787); 
     while (true) { 
      Socket p = server.accept(); 
      new Thread(new ServerThread(p)).start(); 
     } 
    } catch (Exception ex) { 
     System.err.println("Error : " + ex.getMessage()); 
    } 
} 

}

+1

好嗎?聽起來不太有用,但它是您的服務器。那麼你有什麼問題?不知道如何使用Thread.sleep()? – Kayaman

+0

如何把每個客戶端接受等待5分鐘 – user3257587

+0

所以你知道套接字連接,但不是關於Thread.sleep()嗎? – Kayaman

回答

0

這可以很容易地與這樣的ScheduledExecutorService的解決:

public class RespondLater implements Runnable { 

    final Socket client; 

    public RespondLater(final Socket c) { 
    this.client = c; 
    } 

    public void run() { 
    try { 
     System.out.println("5 minutes later on client: " + client.getInetAddress().getHostName()); 
     // do whatever you want with the client 5 minutes later here 
    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
    } finally { 
     try { 
     client.close(); 
     } catch (Exception ex) { 
     } 
    } 
    } 

    public static void main(String[] args) { 
    final ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors()); 
    try (final ServerSocket server = new ServerSocket(8787)) { 
     while (true) { 
     final Socket p = server.accept(); 
     executor.schedule(new RespondLater(p), 5, TimeUnit.MINUTES); 
     } 
    } catch (Exception ex) { 
     System.err.println("Error : " + ex.getMessage()); 
    } finally { 
     executor.shutdownNow(); 
    } 
    } 
} 

請注意,有從未超過Runtime.getRuntime().availableProcessors()線程活躍,所以你可以讓這個構造句柄處理成千上萬的連接。

但是,我認爲大多數客戶會在達到5分鐘之前超時。

+0

用戶沒有要求數千個連接。這個問題說「10個客戶」。 – Holger

+0

沒有人強迫你使用超過10個。 – TwoThe

+0

好吧,它看起來像一個精確的要求,讓我準確地允許十個客戶端。祈禱互聯網的其他部分無法在該服務器上連接,這聽起來不像是我的解決方案。但是,我不知道它是否真的是一個要求。在這個奇怪的問題上很難預測。 – Holger