2014-03-26 54 views
0

我已經建立了一個網絡,我已經設置了閱讀和寫作流的套接字因此類的構造函數的參數:傳遞的BufferedReader作爲

//Set up socket reads and writes 
final BufferedReader in = new BufferedReader(
    new InputStreamReader(client.getInputStream())); 

final PrintWriter out = new PrintWriter(
    client.getOutputStream(), true); 

我想通過這兩個變量,'in'和'out',作爲另一個類的構造函數的參數。這是它的外觀在其他類

BufferedReader in; 
PrintWriter out; 

public ClientThread(BufferedReader in, PrintWriter out) { 
    this.in = in; 
    this.out = out; 

} 

我當時就想使用這些類變量來寫同一個插座這樣的輸出流(類實現Runnable):

public void run() { 
    while (true) { 
     try { 
      String userCommand = in.readLine(); 
     } catch (IOException e) { 
      // Die if something goes wrong. 
      System.err.println(e.toString()); 
      System.exit(1); 
     } 
    } 
} 

然而,每當代碼到達這一點,我得到一個SocketException:

java.net.SocketException: Socket closed 

我該如何解決這個問題?我想分開服務器和套接字的設置,以處理客戶端發出的任何命令。


編輯:下面介紹一下BufferedRead從

//create server socket 
ServerSocket server = new ServerSocket(portNum); 

// Accept a client if it appears 
Socket client = server.accept(); 

EDIT 2獲取輸入:我用這三個文件:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 


public class Client { 

    public static void main(String[] args) throws UnknownHostException, IOException { 
     //Change the socket if it doesn't work 
     Socket sock = new Socket("localhost", 5920); 

     //keyboard 
     final BufferedReader stdin = new BufferedReader(
       new InputStreamReader(System.in)); 

     //input from socket 
     final BufferedReader in = new BufferedReader(
       new InputStreamReader(sock.getInputStream())); 

     //writer to socket 
     final PrintWriter out = new PrintWriter(
       sock.getOutputStream(), true); 

     //new thread for incoming messages 
     (new Thread(){ 

      @Override 
      public void run() { 
       String serverMessage; 

       try { 
        while ((serverMessage = in.readLine()) != null) { 
         System.out.println(serverMessage); 

        } 
       } catch (IOException e) { 
        System.err.println("Something went wrong whilst trying " 
          + "to retrieve a message from the server"); 
        System.exit(-1); 
       } 
      } 
     }).start(); 

     //new thread for outgoing messages 
     (new Thread(){ 

      @Override 
      public void run() { 
       String clientMessage; 

       try { 
        while ((clientMessage = stdin.readLine()) != null) { 
         out.println(clientMessage); 

        } 
       } catch (IOException e) { 
        System.err.println("Something went wrong whilst trying " 
          + "to send a message to the server."); 
        System.exit(-1); 
       } 

      } 

     }).start(); 

    } 

} 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class Server { 

    public static void main(String[] args) throws IOException { 
     ServerSocket server = new ServerSocket(5920); 

     Socket client = server.accept(); 

     //Set up socket reads and writes 
     final BufferedReader in = new BufferedReader(
       new InputStreamReader(client.getInputStream())); 

     final PrintWriter out = new PrintWriter(
       client.getOutputStream(), true); 

     new Thread(new ClassWithParam(in, out)).start(); 

    } 

} 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.PrintWriter; 


public class ClassWithParam implements Runnable { 

    BufferedReader in; 
    PrintWriter out; 

    public ClassWithParam(BufferedReader in, PrintWriter out) { 
     this.in = in; 
     this.out = out; 

    } 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       System.out.println("HERE"); 
       String userCommand = in.readLine(); 
       System.out.println("HERE2"); 
      } catch (IOException e) { 
       // Die if something goes wrong. 
       System.err.println(e.toString()); 
       System.exit(1); 
      } 
     } 

    } 

} 

而現在它的工作原理。不知道發生了什麼。將繼續向頭撞牆。謝謝。

+0

大概這個連接已經關閉了。這與在構造函數中使用BufferedReader無關。我們目前無法幫助您,因爲我們知道什麼是連接。 –

+0

這有幫助嗎? //創建服務器套接字 \t \t \t ServerSocket server = new ServerSocket(portNum);如果它出現 \t \t \t插座客戶= server.accept \t \t \t \t \t \t //接受客戶端(); – MiKenning

+0

不是......我們仍然沒有足夠的背景,所有的信息都應該放在*問題*而不是註釋中。理想情況下,您應該展示一個簡短但完整的程序(或者更可能是一對程序),我們可以使用該程序來重現問題。 –

回答

0

由於某種原因,現在沒有問題。我使用的代碼(我重新創建了),現在可以工作,在說明中。