JAVA TCP客户机-服务器连接

JAVA TCP客户机-服务器连接,java,tcpclient,tcpserver,Java,Tcpclient,Tcpserver,当我运行这个程序时,客户机类会提示用户输入一个命令,该命令应该转到服务器类并打开一个文件,读取该文件的每一行,并将字节长度返回给要显示的客户机类 不幸的是,一旦我输入命令,什么也没有发生&不知道为什么 TCP客户端类 package TcpClient; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; import java.io.*; public class

当我运行这个程序时,客户机类会提示用户输入一个命令,该命令应该转到服务器类并打开一个文件,读取该文件的每一行,并将字节长度返回给要显示的客户机类

不幸的是,一旦我输入命令,什么也没有发生&不知道为什么

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

我建议您仅在两侧使用
DataOutputStream
DataInputStream
,不要使用
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)
    {

    }
}
}

我建议您仅在两侧使用
DataOutputStream
DataInputStream
,不要使用
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)
    {

    }
}
}

首先不要忽略客户机类中的异常。你看,忽略错误消息并不是一个很好的调试方法…我得到的唯一消息是一个关闭clientSocket的警告,但当我这样做时,我仍然得到相同的输出。可能会有各种问题,比如没有正确地关闭此处或此处的套接字,或者连接问题。。。因此,提示:尝试在调试器中运行。添加打印语句以查看发生了什么;也许首先:阅读指导您完成整个客户机/服务器通信过程的分步教程(如)。@n00bie1221您的一个catch块包含注释“或者我们可以这样做:例如printStackTrace();”,但您选择不这样做,这是多么讽刺啊,这是您所展示的代码中最严重的错误。您应该从不忽略客户端类中的异常开始。你看,忽略错误消息并不是一个很好的调试方法…我得到的唯一消息是一个关闭clientSocket的警告,但当我这样做时,我仍然得到相同的输出。可能会有各种问题,比如没有正确地关闭此处或此处的套接字,或者连接问题。。。因此,提示:尝试在调试器中运行。添加打印语句以查看发生了什么;也许首先:阅读指导您完成整个客户机/服务器通信过程的分步教程(如)。@n00bie1221您的一个catch块包含注释“或者我们可以这样做:例如printStackTrace();”,但您选择不这样做,这是您所展示代码中最严重的错误,这是多么讽刺啊。