2016-10-06 7 views
0

Wenn ich dieses Programm ausführe, fordert die Client-Klasse den Benutzer auf, einen Befehl einzugeben, und dieser Befehl sollte zur Server-Klasse gehen und eine Datei öffnen und jede Zeile dieser Datei lesen und die Bytelänge zurückgeben zurück zur Client-Klasse, die angezeigt werden soll.JAVA TCP-Client-Server-Verbindung

Leider, sobald ich den Befehl eingeben, passiert nichts & Nicht sicher warum.

TCP Client Klasse

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 Server Klasse

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

Sie würden durch beginnen ** nicht ** ignoriert Ausnahmen in der Client-Klasse. Sie sehen, ignorieren Fehlermeldungen ist nicht genau eine gute Möglichkeit zum Debuggen ... – GhostCat

+0

Die einzige Nachricht, die ich bekomme, ist eine Warnung, clientSocket zu schließen, aber wenn ich das getan habe, bekomme ich immer noch die gleiche Ausgabe. – n00bie1221

+0

Es kann verschiedene Probleme geben, wie das Schließen von Sockets hier oder da nicht, oder Konnektivitätsprobleme, ... also, Tipp: Versuche, Dinge in einem Debugger auszuführen. Fügen Sie print-Anweisungen hinzu, um zu sehen, was vor sich geht. und vielleicht vor allem: Schritt-für-Schritt-Anleitungen (wie http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html) lesen, die Sie durch den gesamten Prozess der Client/Server-Kommunikation führen. – GhostCat

Antwort

1

Ich schlage vor, Sie nur DataOutputStream und DataInputStream in beiden Seiten und nicht BufferedInputStream zu verwenden. Der leicht modifizierte Code unten ist in der Lage, die Nachricht korrekt vom Client an den Server zu senden. Jetzt können Sie es leicht für das, was Sie erreichen wollen, arbeiten lassen.

Server

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) 
    { 

    } 
} 

} 

Kunde

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) 
    { 

    } 
} 
}