我可以使用多次(输入/输出)流来处理两个节点之间的不同类型的数据传输

时间:2016-03-10 15:51:43

标签: java sockets networking tcp

在这段代码中,我多次使用两个节点检索输入输出数据。 ...当我使用两次以上的输入输出流时,它会在运行此代码时产生这种类型的错误我需要不同的输入和输出,我想存储但不幸的是,如果我使用三次以上的输入/输出流它显示错误

   public class Server {
private static Socket socket;
public void connect() throws IOException{
        int port = 25000;
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("Server Started and listening to the port 25000");
 socket = serverSocket.accept();
}
        //Server is running always. This is done using this while(true) loop

            //Reading the message from the client
  public void first() throws IOException{      
      connect();
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String number = br.readLine();
            System.out.println("Message received from client is "+number);

            //Multiplying the number by 2 and forming the return message
            String returnMessage;
            try
            {
                int numberInIntFormat = Integer.parseInt(number);
                int returnValue = numberInIntFormat*2;
                returnMessage = String.valueOf(returnValue) + "\n";
            }
            catch(NumberFormatException e)
            {
                //Input was not a number. Sending proper message back to   

          client.
                returnMessage = "Please send a proper number\n";
            }
            second();
            String e=br.readLine();System.out.println(e);
      }

       public void second() throws IOException{
            //Sending the response back to the client.
      String returnMessage="Second";
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write(returnMessage);
            System.out.println("Message sent to the client is "+returnMessage);
            bw.flush();
        }

    public static void main(String args[]) throws IOException{

    Server obj = new Server();

    obj.first();
   // obj.second();

           }public class Server {
  private static Socket socket;
     public void connect() throws IOException{
        int port = 25000;
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("Server Started and listening to the port 25000");
  socket = serverSocket.accept();
   }
        //Server is running always. This is done using this while(true) loop

            //Reading the message from the client
   public void first() throws IOException{      
      connect();
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String number = br.readLine();
            System.out.println("Message received from client is "+number);

            //Multiplying the number by 2 and forming the return message
            String returnMessage;
            try
            {
                int numberInIntFormat = Integer.parseInt(number);
                int returnValue = numberInIntFormat*2;
                returnMessage = String.valueOf(returnValue) + "\n";
            }
            catch(NumberFormatException e)
            {
                //Input was not a number. Sending proper message back to client.
                returnMessage = "Please send a proper number\n";
            }
            second();
            String e=br.readLine();System.out.println(e);
      }

      public void second() throws IOException{
            //Sending the response back to the client.
      String returnMessage="Second";
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write(returnMessage);
            System.out.println("Message sent to the client is "+returnMessage);
            bw.flush();
        }

       public static void main(String args[]) throws IOException{

       Server obj = new Server();

       obj.first();
   // obj.second();

    }
           public class client {

       private static Socket socket;

    //public void connect() throws UnknownHostException, IOException{



   //}
    public void first() throws IOException{
   String host = "localhost";
        int port = 25000;
        InetAddress address = InetAddress.getByName(host);
        socket = new Socket(address, port);

     OutputStream os = socket.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(osw);

        String number = "2";

        String sendMessage = number + "\n";
        bw.write(sendMessage);
        bw.flush();
        System.out.println("Message sent to the server : "+sendMessage);
     String sendMessage1="3333";
    bw.write(sendMessage1);
     bw.flush();
    //second();

        }


        public void second1() throws IOException{

     //Get the return message from the server
    InputStream is = socket.getInputStream();
        InputStreamReader isr;
       isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String message = br.readLine();
        System.out.println("Message received from the server : " +message);
    socket.close();
  }
  public static void main (String argd[]) throws IOException{

    client obj1 = new client();
    obj1.first();




    }
    -----------------------------------------

          error

          Message received from client is 2
            Message sent to the client is Second
      Exception in thread "main" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:209)
       at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)

1 个答案:

答案 0 :(得分:0)

InputStreamOutputStream旨在使用单一来源和目的地。一旦获得从文件/套接字/任何源读取的InputStream,您就可以将其用于多个连续读取。但是,一旦完成从该源读取,您需要在流上调用close()方法。

不关闭流是Java中内存泄漏的经典原因。事实上,由于这个原因,你总是期望用try catch包围你的源代码,并且总是在finally语句中调用close()方法。所以要确保它总是被调用。此外,由于close()方法本身可能会导致Exception,因此在最终语句中您需要使用自己的try-catch包围它。从java 7开始,有一个名为&#34的新功能;尝试使用资源"处理这个特殊问题。

请阅读here