2016-10-06 397 views
0

當我運行該程序時,Client類提示用戶輸入一個命令,該命令應該轉到Server類並打開一個文件並讀取該文件的每一行並返回字節長度返回到要顯示的客戶端類。JAVA TCP客戶端 - 服務器連接

不幸的是,一旦我輸入命令,什麼也沒有發生&不知道爲什麼。

TCP客戶端類

package TcpClient; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.io.*; 

public class TcpClient { 
    public static void main(String[] args) { 
    String temp; 
    String displayBytes; 
    try { 
     //create input stream 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     //create client socket, connect to server 
     Socket clientSocket = new Socket("localhost",5555); 
     //create output stream attached to socket 
     DataOutputStream outToServer = 
     new DataOutputStream(clientSocket.getOutputStream()); 

     System.out.print("Command : "); 

     //create input stream attached to socket 
     BufferedReader inFromServer = 
     new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     temp = inFromUser.readLine(); 

     //send line to server 
     outToServer.writeBytes(temp); 

     //read line from server 
     //displayBytes = inFromServer.readLine(); 

     while((displayBytes = inFromServer.readLine()) != null) { 
     System.out.print(displayBytes); 
     } 
     //clientSocket.close(); 
    } 
    catch(Exception ex) { 
    } 
    } 
} 

TCP服務器類

package TcpServer; 

import java.io.BufferedReader; 
import java.io.*; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class TcpServer { 
    public static void main(String[] args) { 
    // The name of the file to open. 
    String fileName = "input.txt"; 
    // This will reference one line at a time 
    String line = null; 
    String holder=null; 
    String clientWord; 
    int bytNumber; 

    try { 
     //create welcoming socket at port 5555 
     ServerSocket welcomeSocket = new ServerSocket(5555); 
     //wait, on welcoming socket for contact by client 
     Socket connectionSocket = welcomeSocket.accept(); 
     //create input stream, attached to socket 
     BufferedReader inFromClient = 
     new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
     //create output stream, attached to socket 
     DataOutputStream outToClient = 
     new DataOutputStream(connectionSocket.getOutputStream()); 
     //read in line from socket 
     clientWord = inFromClient.readLine(); 

     if(clientWord.equals("query")) { 
     try { 
      // FileReader reads text files in the default encoding. 
      FileReader fileReader = new FileReader(fileName); 

      // Always wrap FileReader in BufferedReader. 
      BufferedReader buffer = new BufferedReader(fileReader); 

      while((line = buffer.readLine()) != null) { 
      System.out.println(line); 
      bytNumber = line.getBytes().length; 
      holder=Integer.toString(bytNumber); 
      //pr.println(bytNumber);//only printing first line not going until eof 
      outToClient.writeBytes(holder); 
      // line = buffer.readLine(); 
      // pr.flush(); 
      } 

      // Always close files. 
      buffer.close();   
     } 
     catch(FileNotFoundException ex) { 
      System.out.println("Unable to open file '" + fileName + "'"); 
     } 
     catch(IOException ex) { 
      System.out.println ("Error reading file '" + fileName + "'"); 
      // Or we could just do this: 
      // ex.printStackTrace(); 
     } 
     }// end if statement 
    } 
    catch(Exception ex) { 
    } 
    } 
} 
+1

你會被啓動** **不能在您的客戶端類忽略例外。你看,忽略錯誤消息不是一個好的調試方法... – GhostCat

+0

我得到的唯一消息是關閉clientSocket的警告,但是當我這樣做時,我仍然得到相同的輸出。 – n00bie1221

+0

可能存在各種問題,比如沒有正確關閉套接字或連接問題......所以,提示:嘗試在調試器中運行。添加打印語句以查看正在發生的事情;也許首先:閱讀一步一步的教程(如http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html),指導您完成客戶端/服務器通信的整個過程。 – GhostCat

回答

1

我建議你只在雙方DataOutputStreamDataInputStream和不使用BufferedInputStream。 下面稍微修改的代碼能夠將消息從客戶端正確地發送到服務器。現在,您可以輕鬆實現您想要實現的目標。

服務器

import java.io.BufferedReader; 
import java.io.*; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 



public class TcpServer { 


public static void main(String[] args) { 
    // The name of the file to open. 
    String fileName = "input.txt"; 
    // This will reference one line at a time 
    String line = null; 
    String holder=null; 
    String clientWord; 
    int bytNumber; 

    try 
    { 
     //create welcoming socket at port 5555 
     ServerSocket welcomeSocket = new ServerSocket(5555); 
     //wait, on welcoming socket for contact by client 
     Socket connectionSocket = welcomeSocket.accept(); 
     //create input stream, attached to socket 
     DataInputStream inFromClient = 
       new DataInputStream(connectionSocket.getInputStream()); 
     //create output stream, attached to socket 
     DataOutputStream outToClient = 
       new DataOutputStream(connectionSocket.getOutputStream()); 
     //read in line from socket 
     clientWord = inFromClient.readUTF(); 
    System.out.println(clientWord); 

     if(clientWord.equals("query")) 
     { 


      try 
      { 
     // FileReader reads text files in the default encoding. 
     FileReader fileReader = new FileReader(fileName); 


     // Always wrap FileReader in BufferedReader. 
     BufferedReader buffer = new BufferedReader(fileReader); 


       while((line = buffer.readLine()) != null) 
       { 
      System.out.println(line); 
      bytNumber = line.getBytes().length; 
      holder=Integer.toString(bytNumber); 
      //pr.println(bytNumber);//only printing first line not going until eof 
      outToClient.writeBytes(holder); 
      // line = buffer.readLine(); 
      // pr.flush(); 
       } 

     // Always close files. 
     buffer.close();   
      } 
      catch(FileNotFoundException ex) 
      { 
     System.out.println(
      "Unable to open file '" + 
      fileName + "'");     
      } 
      catch(IOException ex) 
      { 
     System.out.println(
      "Error reading file '" 
      + fileName + "'");     
     // Or we could just do this: 
     // ex.printStackTrace(); 
      } 

     }// end if statement 
    } 

    catch(Exception ex) 
    { 

    } 
} 

} 

客戶

import java.io.BufferedReader; 
    import java.io.InputStreamReader; 
    import java.net.Socket; 
    import java.io.*; 


    public class TcpClient { 


     public static void main(String[] args) { 
     String temp; 
     String displayBytes; 
     try 
     { 
     //create input stream 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     //create client socket, connect to server 
     Socket clientSocket = new Socket("localhost",5555); 
     //create output stream attached to socket 
     DataOutputStream outToServer = 
       new DataOutputStream(clientSocket.getOutputStream()); 



     System.out.print("Command : "); 

     //create input stream attached to socket 
     DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream()); 

     temp = inFromUser.readLine(); 

     //send line to server 
     //outToServer.writeBytes(temp); 
     outToServer.writeUTF(temp); 
     outToServer.flush(); 


     //read line from server 
     //displayBytes = inFromServer.readLine(); 

     while((displayBytes = inFromServer.readUTF()) != null) 
     { 
     System.out.print(displayBytes); 
     } 
     //clientSocket.close(); 
    } 
    catch(Exception ex) 
    { 

    } 
} 
} 
相關問題