2011-07-03 52 views
2

我是新來的套接字編程,並試圖編寫一個簡單的cmd線聊天應用程序。 現在我使用下面的代碼接受一個連接,然後創建一個新的線程爲相同的,但沒有創建新的線程,並且不再有一個客戶端支持(這是通常當線程不使用時),爲什麼不創建單獨的線程?

public class chatserver extends Thread{ 
    public static Socket client; 
    public static void main(String a[]) throws Exception{ 
     ServerSocket srv = new ServerSocket(4444); 
     if((client = srv.accept())!=null){ 
      new newthread(client); 
     } 
    } 
} 
class newthread extends Thread{ 
    private Socket client; 
    public newthread(Socket client){ 
     super("chatchild"); 
     this.client = client; 
     start(); 
} 

爲什麼不創建線程?我下文稱的例子在「oracle.com」,其中一個包含了相同的代碼,但我不能找出確切順序會發生什麼以及該片段時從接受連接,並創建線程::

while (listening) 
     new KKMultiServerThread(serverSocket.accept()).start(); 

現在這裏聽是布爾VAR坐在真實的,但它永遠不會設定爲f的exaple代碼在代碼中的任何地方都可以。這是如何工作的?

+1

您究竟在跟蹤哪個示例?我覺得很奇怪你的類是從'Thread'派生而不是簡單的_use_'Thread'來完成他們的工作。 – sarnold

+1

還有一件事..不​​要在構造函數中啓動線程。這是不安全的,因爲一個非完全構造的對象可以被這個線程看到。 –

+0

@sarnold我在下面的例子[鏈接](http://download.oracle.com/javase/tutorial/networking/sockets/),\ – buch11

回答

2

你必須不斷地調用接受()創建其他線程:

public static void main(String a[]) throws Exception{ 
    ServerSocket srv = new ServerSocket(4444); 

    while (listening) { 
     new newthread(srv.accept()); 
    } 
} 

變量,如果當你想停止服務器應設置爲false。

2

哪裏是你的運行方法是什麼?如果沒有Thread或Runnable中的運行方法,我認爲您的線程無法執行任何操作。

+2

+1 - 更具體地說,它將執行默認的'run'方法,它不會執行任何操作......線程將立即終止。 –

+0

我已經擴展了Thread超類,所以現在不需要實現Runnable接口,我可以使用Thread類本身的方法。 – buch11

+0

@Stephenç嘿,我在我的節目中的run()方法,我只是didnt張貼一部分,有沒有被連的時間部分產生不需要的線程... – buch11

0

最後,我已經解決了這個問題,事情是socket.accept()第一個客戶接觸後法沒有剩餘的活動......沒有什麼是錯的run方法,它作爲socket.accept的財產()方法...

相關問題