2015-06-14 46 views
3

我已經構建了一個java代理,它的工作原理,但只允許1個客戶端。我知道,我需要做的多線程這就是爲什麼我已經做到了,因此打開了新的線程,但我不能讓它出於某種原因...Java製作代理套接字多線程

這是我的代理類:

public class Proxy { 

    private static ServerSocket server; 
    private static int port = 9339; 
    private static String originalHost = "game.boombeachgame.com"; 

    public static void main(String[] args) throws FileNotFoundException { 
     System.out.println("INFO: Proxy started"); 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       Proxy.startThread(); 
      } 

     }).start(); 
    } 

    public static void startThread() { 
     try { 
      server = new ServerSocket(port); 
      Socket clientSocket = server.accept(); 
      new Thread(new Server(originalHost)).start(); 
      new Thread(new Client(clientSocket)).start(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 


} 
+0

您需要調用accept()並啓動線程來處理循環中接受的套接字。 – EJP

+0

@EJP困惑我:(把它放在一個循環中,但沒有工作.. –

回答

0

您需要的是一個運行循環的線程,該循環通過調用ServerSocket上的accept()方法來檢查服務器套接字是否有新連接。對於每個連接,您需要生成一個線程來處理該連接。

你的代碼實際上做的是通過調用accept()來檢查服務器套接字是否有新連接,只有一次。然後您正確地從客戶端線程中分離出來以處理該連接。但是,您不會再次調用accept()。這就是您的代碼工作的原因,但僅限於一個客戶端。你也產生了一個「服務器」對象的線程;我不知道如何適合。

你需要改變的是運行「server.accept()」語句和相關聯的線程在循環中產卵。您還需要確保正確處理線程,以便不同的連接最終不會使用彼此的數據。這可能需要以適當的方式連接「服務器」對象和「客戶端」對象。

+0

嗯,似乎困惑了我,不知道該怎麼辦... –

+0

我提出了一些澄清。關鍵是,接受)調用需要在一個循環內,而不是隻調用一次。 –

+0

循環是什麼呢?我試着把所有東西都放在try-catch部分中,但是它沒有工作。 –