2011-02-24 73 views
27

我試圖去適應我的簡單的socket服務器,以便它可以有多個TCP連接的多個連接,通過多線程,但我似乎無法得到它的工作。到目前爲止我的代碼如下所示,我真的不知道從哪裏何去何從:創建一個套接字服務器允許通過線程和Java

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

public class DoSomethingWithInput implements Runnable { 
    private final Socket clientSocket; //initialize in const'r 
    public void run() { 


    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     String nextline; 
     while ((nextline = in.readLine())!=null) { 
      System.out.println(nextline); 
     } //... close socket, etc. 
    } 
} 


public class Socket{ 

    public Socket() { 
} 
@Override 
public void run() { 
    try { 
    ServerSocket serverSocket = null; 
    serverSocket = new ServerSocket(5432); 
    for (;;) { 
     ServerSocket serverSocket = null; 
     serverSocket = new ServerSocket(5432); 
     for (;;) { 
     Socket clientSocket = null; 
     clientSocket = serverSocket.accept(); 
     //delegate to new thread 
     new Thread(new DoSomethingWithInput(clientSocket)).start(); 
     } 
    } 
    }catch (IOException e) { 
    System.err.println("Could not listen on port: 5432."); 
    System.exit(1); 
} 
} 
} 

會有人能夠給我我如何能做到這一點一些指點,爲什麼我目前的實現不會工作?我是通過Java教程http://download.oracle.com/javase/tutorial/networking/sockets/examples/KKMultiServerThread.java這裏提示運行,但他們在這裏給出例子似乎使用大量的外部資源和類,如KnockKnockProtocol等等等等

會有人能夠幫我這個?

非常感謝!

回答

50

的問題是,目前你正在接受連接,但直到它的關閉就可以了,然後立即進行攔截寫着:

// After a few changes... 
Socket clientSocket = serverSocket.accept(); 
BufferedReader in = new BufferedReader(new InputStreamReader(
    clientSocket.getInputStream())); 
String nextLine; 
while ((nextLine = in.readLine()) != null) { 
    System.out.println(nextline); 
} 

這意味着它接受的連接試圖在同一個線程處理的連接。這不會讓你同時使用多個連接。

取而代之,創建一個實現Runnable的類(例如ConnectionHandler),並且構造函數的參數爲​​Socket。它的run方法應該處理連接。然後將您的代碼更改爲:

Socket clientSocket = serverSocket.accept(); 
Runnable connectionHandler = new ConnectionHandler(clientSocket); 
new Thread(connectionHandler).start(); 

這將使您的「主」線程自由等待下一個連接。

(順便說一句,在KnockKnockProtocol類是不是真正的「外部」 - 這是示例的一部分,他們只是沒有非常清楚的是,source is here ...。)

+0

你能不能舉一個例子你建議那個班? – 2016-07-19 13:27:05

+0

@DanyLavrov:不,我想我已經在這裏提供了足夠的信息 - 我並不想開始做大量的工作來添加一個超過5年的答案,並且它看起來對大多數人來說有足夠的信息。如果您嘗試使用它並遇到問題,也許您應該提出一個新問題,顯示您嘗試過的以及出錯的地方,並參考此答案。 – 2016-07-19 13:29:12

+0

並不重要。我已經知道了,謝謝。 – 2016-07-19 15:42:08

17

你不是多線程。您正在創建一個綁定在端口上的線程,然後從任何客戶端套接字讀取,直到連接關閉。

您需要的插座傳遞到一個新的線程,並把它讀。

public class DoSomethingWithInput implements Runnable { 
    private final Socket clientSocket; //initialize in const'r 
    public void run() { 

     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     String nextline; 
     while ((nextline = in.readLine())!=null) { 
      System.out.println(nextline); 
     } //... close socket, etc. 
    } 
} 

//... 
ServerSocket serverSocket = null; 
serverSocket = new ServerSocket(5432); 
for (;;) { 
    Socket clientSocket = null; 
    clientSocket = serverSocket.accept(); 
    //delegate to new thread 
    new Thread(new DoSomethingWithInput(clientSocket)).start(); 
} //... 
相關問題