Cuando ejecuto este programa de la clase Cliente solicita al usuario que introduzca un comando, y que el comando debe ir a la clase de Servidor y abrir un archivo y leer cada línea de ese archivo y devolver la longitud en bytes de la espalda a la clase de Cliente que se mostrará.

Por desgracia, una vez que ingrese el comando, no pasa nada & No sé por qué.

Cliente TCP Clase

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

Servidor TCP Clase

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) {
}
}
}
  • Empezamos por no ignorar las excepciones en la clase del cliente. Usted ve, ignorando los mensajes de error no es exactamente una buena forma de depurar …
  • El único mensaje que me sale es una advertencia para cerrar clientSocket, pero cuando hice que me dan el mismo resultado.
  • No puede haber varios problemas, como no cerrar adecuadamente los sockets aquí o allí, o problemas de conectividad, … así que, sugerencia: tratar de hacer las cosas en un depurador. Agregar instrucciones de impresión para ver lo que está pasando; y tal vez la primera de todas: la de leer el paso a paso tutoriales (como docs.oracle.com/javase/tutorial/networking/sockets/…), que guía a través de todo el proceso de la comunicación cliente/servidor.
  • Qué irónico que uno de sus bloques catch contiene el comentario «o podríamos simplemente hacer esto: ex.printStackTrace();» y sin embargo usted elija no para hacerlo, lo cual es el peor error en el código que has mostrado.
InformationsquelleAutor n00bie1221 | 2016-10-06

1 Comentario

  1. 4

    Le sugiero que sólo DataOutputStream y DataInputStream en ambos lados y a no utilizar BufferedInputStream.
    El modificado ligeramente el código de abajo es capaz de enviar correctamente el mensaje desde el cliente al servidor. Ahora usted puede fácilmente hacer que funcione para lo que quieres lograr.

    Servidor

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

    Cliente

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

Dejar respuesta

Please enter your comment!
Please enter your name here