2012-10-28 93 views
0
/*main method*/ 

Server server = new Server(tcpPort); 
new Thread(server).start(); 

try { 

    Thread.sleep(1000*60); /* 60 seconds*/ 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

server.stop; 
... 

這是我寫的代碼。服務器線程已啓動,並運行60秒。我如何改變這個無限運行,當用戶通過BufferedReader或其他東西輸入回車時結束。簡單的Java線程化的TCP服務器線程

我已經與

while(!input.equals("")) { /* just pseudocoded here...*/ 
Thread.sleep(10); 
} 

嘗試過,但無法正常工作,這將我的服務器停止。我的客戶甚至不會連接到它。我是否犯了設計錯誤,或者這是一個容易解決的問題?

+2

請張貼您的實際代碼。 –

回答

0

從此SO線程開始:How to create a basic Java Server?。它會給你一個如何編寫一個非常簡單的服務器的例子。關鍵要注意的是serverSocket.accept()。它會阻止 - 換句話說,它會永遠等待客戶端連接,或者在出現錯誤時會失敗。一旦連接了一個客戶端,你將得到一個clientSocket,你可以使用它來讀取客戶端寫的內容,並寫入它。

這對理解Java網絡編程來說是一個很好的起點。不過,我建議您閱讀有關此主題的更多信息。就像這樣:http://beej.us/guide/bgnet/

+0

是的,但我有一個工作的服務器。我的班級服務器工作正常。你們有沒有讀過,我的問題是什麼?我的服務器正在運行,但只有這60秒。 (請參閱Thread.sleep行)但是,我想使它永遠運行,並退出服務器,如果我從System.in獲得任何輸入。 – user1781173

+0

我沒看過。也許我應該告訴你,而不是'Thread.sleep(60000)'你寫'shouldExit = false; while(shouldExit){doServerStuff(); }'。它將永遠循環調用doServerStuff(),直到shouldExit變爲true。閱讀下面的Kumar示例 - 在無限循環中等待客戶端連接,在單獨的線程中處理它們。但是,它不會停止服務器,因爲你想要的。你應該很容易自己做。 – DejanLekic

2

-試試這個我寫的基本聊天服務器。該服務器只是保持循環運行,並將客戶端發送的消息廣播到與此服務器關聯的所有其他客戶端。

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 

public class Server { 

    // ///----------------------------------------Instance Variable Fields 
    ServerSocket ss = null; 
    Socket incoming = null; 

    // ///----------------------------------------Instance Variable Fields 

    // ///---------------------------------------- static Variable Fields 
    public static ArrayList<Socket> socList = new ArrayList<Socket>(); 

    // ///---------------------------------------- static Variable Fields 

    public void go() { 

     try { 

      ss = new ServerSocket(25005); 

      while (true) { 

       incoming = ss.accept(); 
       socList.add(incoming); 
       System.out.println("Incoming: " + incoming); 
       new Thread(new ClientHandleKaro(incoming)).start(); 

      } 

     } catch (IOException e) { 

      e.printStackTrace(); 
     } finally { 

      try { 
       ss.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 

    class ClientHandleKaro implements Runnable { 

     InputStream is = null; 
     OutputStream os = null; 
     InputStreamReader isr = null; 
     BufferedReader br = null; 
     PrintWriter pw = null; 
     boolean isDone = false; 

     Socket sInThread = null; 

     public ClientHandleKaro(Socket sxxx) { 

      this.sInThread = sxxx; 

     } 

     @Override 
     public void run() { 

      if (sInThread.isConnected()) { 

       System.out.println("Welcamu Clienta"); 
       System.out.println(socList); 
      } 

      try { 
       is = sInThread.getInputStream(); 
       System.out.println("IS: " + is); 
       isr = new InputStreamReader(is); 
       br = new BufferedReader(isr); 

       os = sInThread.getOutputStream(); 
       pw = new PrintWriter(os, true); 

       String s = new String(); 

       while ((!isDone) && (s = br.readLine()) != null) { 

        String[] asx = s.split("-"); 
        System.out.println("On Console: " + s); 

        // pw.println(s); 

        Thread tx = new Thread(new ReplyKaroToClient(s, 
          this.sInThread)); 
        tx.start(); 

        if (asx[1].trim().equalsIgnoreCase("BYE")) { 

         System.out.println("I am inside Bye"); 
         isDone = true; 

        } 
       } 
      } catch (IOException e) { 

       System.out.println("Thanks for Chatting....."); 
      } finally { 

       try { 
        Thread tiku = new Thread(new ByeByeKarDo(sInThread)); 
        tiku.start(); 
        try { 
         tiku.join(); 
        } catch (InterruptedException e) { 

         e.printStackTrace(); 
        } 

        System.out.println("Accha to hum Chalte hain !!!"); 
        System.out.println(socList); 

        br.close(); 
        pw.close(); 
        sInThread.close(); 

       } catch (IOException e) { 

       } 
      } 

     } 

    } 

    class ReplyKaroToClient implements Runnable { 

     public String mString; 
     public Socket mSocket; 

     public ReplyKaroToClient(String s, Socket sIn) { 

      this.mString = s; 
      this.mSocket = sIn; 
     } 

     @Override 
     public void run() { 

      for (Socket sRaW : socList) { 

       if (mSocket.equals(sRaW)) { 
        System.out.println("Mai same hun"); 
        continue; 

       } else { 
        try { 
         new PrintWriter(sRaW.getOutputStream(), true) 
           .println(mString); 
        } catch (IOException e) { 

         System.out.println("Its in Catch"); 

        } 
       } 
      } 

     } 

    } 

    class ByeByeKarDo implements Runnable { 

     Socket inCom; 

     public ByeByeKarDo(Socket si) { 

      this.inCom = si; 
     } 

     @Override 
     public void run() { 

      try { 
       new PrintWriter(inCom.getOutputStream(), true) 
         .println("You have Logged Out of Server... Thanks for ur Visit"); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 

     } 

    } 

    public static void main(String[] args) { 

     new Server().go(); 
    } 
} 
+0

謝謝,但我有一個運行服務器。看到下面的帖子的評論,或更仔細地閱讀我的話題。這不是關於服務器本身。 – user1781173