2013-05-10 106 views
0

我有一個簡單的服務器...NTP爲TCP/IP(服務器端)

public static void main(String[] args) throws Exception{ 
    ServerSocket server = new ServerSocket(2000); 
    Socket sock = server.accept(); 
    InputStream in = sock.getInputStream(); 
    OutputStream out = sock.getOutputStream(); 
    PrintWriter w = new PrintWriter(out); 
    Scanner s = new Scanner(in); 
    ... 

和一個簡單的客戶端...

public static void main(String[] args) throws Exception{ 
    Socket sock = new Socket("localhost",2000);; 
    InputStream in= sock.getInputStream(); 
    OutputStream out = sock.getOutputStream(); 
    PrintWriter w = new PrintWriter(out); 
    Scanner s = new Scanner(in); 
    .... 

- 如何我可以連接更多的客戶這臺服務器? (我需要2更多) - 我也想發送系統時間從服務器到客戶端,然後客戶端將發送 回到他們的時間每個加上一些固定的延遲(0.5-1秒),然後服務器必須找到所有平均延遲和發送回客戶端作爲新的時間...

感謝您的時間...

+0

server.accept在一個循環中,並將套接字返回給一個單獨的線程。您可以考慮使用ExecutorService。 – Fildor 2013-05-10 10:25:31

回答

0

System.currentTimeMillis()提供系統時間

每個插槽返回由server.accept()是一個獨立的對象,您的服務器可以通過每個Socket對象與每個客戶端獨立通信。但是,由於您的應用程序對時間敏感,因此我建議爲每個客戶端使用一個單獨的線程。

一個簡單的服務器將是:

ServerSocket serverSock = new ServerSocket(2000); 

while (true) 
{ 
    Socket fpSock = serverSock.accept(); 
    MyThread t = new MyThread(fpSock, this); 
    t.start(); 
} 

您所需要的處理將在MyThread的run()方法來實現。 「this」被傳遞給線程以提供一個引用,其中每個線程都可以回調主類中的方法。確保製作這樣的方法​​。

您也不一定需要將服務器的時間發送到客戶端,只需發送一個通用的數據包,客戶端應該回顯。爲所有事務使用服務器的時間戳,以避免客戶端系統時間的變化。

+0

Big thx ... m8 ... 對於我來說,仍然很難讓我不習慣線程和套接字...我現在正在學習它們......但是我會試試它..: ) – 2013-05-10 10:57:05

+0

還有一個問題.... 嗯....如果我有2個或更多的無限循環我怎麼能把它們串起來讓它們可以一起運行? – 2013-05-10 11:04:26

+0

你可以有2個無限循環沒有問題。但是,您可能只想運行某些方法的一個實例,並且必須將它們標記爲「已同步」。閱讀Java多線程和併發性以獲取更多信息。 – nitegazer2003 2013-05-22 09:27:56