2009-12-25 29 views
2

我是Java初學者,我有一個任務來構建P2p文件共享Java應用程序。 我開始創建服務器和客戶端。客戶端可以發送消息給服務器和服務器響應。我相信下一步應該是將Thread插入到服務器類中。我讀了所有關於它,並試圖萌芽,我不能把它關閉。我希望有一個人可以幫助我。 這裏是服務器類:如何將線程添加到我的服務器?

import java.net.*; 
import java.io.*; 
import java.util.*; 

public class Server { 

    private static ServerSocket serverskiSoket; 
    private final static int PORT = 3334; 

    public static void main(String[] args) { 
    System.out.println("Server se povezuje na port: "+PORT); 

    try { 
     serverskiSoket = new ServerSocket(PORT); 
     System.out.println("Server aktivan: " + serverskiSoket); 
     System.out.println("Ceka se klijent ..."); 
    } catch (IOException ex) { 
     String dodatnaPoruka = ex.getMessage().toString(); 

     if (dodatnaPoruka.equals("Address already in use: JVM_Bind")) 
      System.out.println("Nemoguce je povezati se na port "+ PORT +" jer je zauzet od strane drugog servera."); 
      System.exit(1); 
    } 

    do { 
     handleClient(); 
    } while(true); 
    } 

    private static void handleClient() { 
    Socket link = null; 

    try { 
     link = serverskiSoket.accept(); 
     System.out.println("Klijent povezan: " + link); 

     Scanner ulazniTok = new Scanner(link.getInputStream()); 
     PrintWriter izlazniTok = new PrintWriter(link.getOutputStream(), true); 

     int brojPoruka = 0; 
     String poruka = ulazniTok.nextLine(); 

     while(!poruka.equals("zatvori")) { 
      System.out.println("Klijent kaze: " + poruka); 
      brojPoruka++; 
      izlazniTok.println("Poruka: " + brojPoruka + ": " + poruka); 
      poruka = ulazniTok.nextLine(); 
     } 

     izlazniTok.println(brojPoruka + " poruka poslato."); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     try { 
      System.out.println("Konekcija se zatvara..."); 
      link.close(); 
     } catch(IOException ioEx) { 
      System.out.println("Diskonekcija nije moguca! \nRazlog: " + ioEx.getMessage()); 
      System.exit(1); 
     }  
    } 
    } 
} 

這裏是Client類:

import java.net.*; 
import java.io.*; 
import java.util.*; 

public class Klijent { 

    private static InetAddress host; 
    private static final int PORT = 3334; 

    public static void main(String[] args) { 
    System.out.println("Povezivanje klijenta u toku. Molim sacekajte..."); 

    try { 
     host = InetAddress.getLocalHost(); 
    } catch (UnknownHostException ex) { 
     System.out.println("ID hosta nije pronadjen"); 
     System.exit(1); 
    } 

    pristupiServeru(); 
    } 

    private static void pristupiServeru() { 
    Socket link = null; 

    try { 
     link = new Socket(host, PORT); 
     String IPAdresa = StringCutter.RaseciString(host.toString()); 
     System.out.println("Povezan na host cija je IP adresa: "+IPAdresa+", a port: "+PORT); 


     Scanner ulazniTok = new Scanner(link.getInputStream()); 
     PrintWriter izlazniTok = new PrintWriter(link.getOutputStream(), true); 

     Scanner unosKorisnika = new Scanner(System.in); 

     String poruka, odgovor; 

     do { 
     System.out.println("Unesite poruku: "); 
     poruka = unosKorisnika.nextLine(); 
     izlazniTok.println(poruka); 
     odgovor = ulazniTok.nextLine(); 
     if (!odgovor.contains("primljeno")) 
      System.out.println("Rekli ste serveru: " + odgovor); 
     else System.out.println(odgovor); 
    } while (!poruka.equals("zatvori")); 
    } catch (IOException ex) { 
    ex.printStackTrace(); 
    } finally { 
    try { 
     System.out.println("\n*Zatvara se konekcija sa serverom...*"); 
     link.close(); 
    } catch (IOException ex){ 
     System.out.println("Diskonekcija je nemoguca"); 
     System.exit(1); 
    } 
    } 
} 
} 
+0

出於好奇,你是從頭開始的P2P或者你想使用現有的框架?無論哪種方式,我想聯繫(電子郵件在個人資料中)。 – 2009-12-25 20:12:18

回答

1

這裏做的一個非常簡單的方法 - 我沒有通過所有的代碼閱讀,因此,測試是爲了確保它不會破壞任何東西。

private static void handleClient() { 
    new Thread() { 
    public void run() { 
     Socket link = null; 
     ... 
     } catch(IOException ioEx) { 
      System.out.println("Diskonekcija nije moguca! \nRazlog: " + ioEx.getMessage()); 
      System.exit(1); 
     }  
    } // end outer try 
    }.start() // end thread 
} 

基本上,您每次都在一個新線程中執行處理程序。它看起來像處理程序不需要將數據返回到主循環,所以應該沒問題。

除了那麼你可能有太多的線程,所以你真的應該看看Executors.newFixedThreadPool()http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool%28int%29)的池。

編輯:瀏覽代碼,我能看到的一個問題是您的輸出可能會在線程間交錯。不知道你是否在乎 - 我無法閱讀任何輸出語言。

+0

固定。 再次感謝您:) 是的,我在這裏是新的,我希望我會好起來。 – 2009-12-25 02:16:07

2

你看過Java插座教程嗎?他們給出了其中一個頁面上的多線程服務器的示例。嘗試模仿他們在他們的代碼中做什麼(你將需要創建另一個類)。 您可以在此頁面底部的示例代碼:http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html

查找標題爲「支持多個客戶端」

+0

謝謝danben,我把你的代碼植入了服務器,它工作得很好。還有一個例外,我不得不照顧,但否則它是偉大的。 對不起,我沒有從塞爾維亞語翻譯成英文,我意識到剛纔我犯了這個錯誤。 @Roman Stolper 是的,我看過那個頁面。它是其中之一,所以我不認爲它是重要的和有用的。現在你已經告訴過我,我一定會去閱讀。再次感謝 – 2009-12-25 02:06:20

+0

不客氣。很高興它解決了 - 如果你能將我的答案標記爲已接受,那將會很棒。 – danben 2009-12-25 02:11:03

+0

另外,既然你是新來的 - 一般如果你想回應我,你會留下評論我的答案。儘管如此,我找到了。 – danben 2009-12-25 02:11:55