Home > front end >  how to implement ByteArrayOutputStream to read full server output in java socket program?
how to implement ByteArrayOutputStream to read full server output in java socket program?

Time:02-22

I need help with implementing an byteArrayOutputStream that stores the output from the server, which I can then read from and print. Does anyone know how to do this? Any help would be much appreciated.

This is what it is supposed to return: enter image description here

and this is what my code returns: enter image description here

the cmd command used to get the output from the server:

java TCPAsk whois.iis.se 43 google.se 

TCPAsk:

import java.net.*;
import java.io.*;
import tcpclient.TCPClient;

public class TCPAsk {
    /*
     * Usage: explain how to use the program, then exit with failure status
     */
    private static void usage() {
        System.err.println("Usage: TCPAsk host port <data to server>");
        System.exit(1);
    }

    /*
     * Main program. Parse arguments on command line and call TCPClient
     */
    public static void main( String[] args) {
        String hostname = null;
        int port = 0;
        byte[] userInputBytes = new byte[0];

        try {
            // Get mandatory command line arguments: hostname and port number
            int argindex = 0;
            hostname = args[argindex  ];
            port = Integer.parseInt(args[argindex  ]);

            // Remaining arguments, if any, are string to send to server
            if (argindex < args.length) {
                // Collect remaining arguments into a string with single space as separator
                StringBuilder builder = new StringBuilder();
                boolean first = true;
                while (argindex < args.length) {
                    if (first)
                        first = false;
                    else
                        builder.append(" ");
                    builder.append(args[argindex  ]);
                }
                builder.append("\n");
                userInputBytes = builder.toString().getBytes();
            }
        } catch (ArrayIndexOutOfBoundsException | NumberFormatException ex) {
            // Exceeded array while parsing command line, or could
            // not convert port number argument to integer -- tell user
            // how to use the program
            usage();
        }

        try {
            TCPClient tcpClient = new tcpclient.TCPClient();
            byte[] serverBytes  = tcpClient.askServer(hostname, port, userInputBytes);
            String serverOutput = new String(serverBytes);
            System.out.printf("%s:%d says:\n%s", hostname, port, serverOutput);
        } catch(IOException ex) {
            System.err.println(ex);
            System.exit(1);
        }
    }
}

CodePudding user response:

You didn't send the user data to the server. Just modify TCPClient like this:

package tcpclient;

import java.net.*;
import java.io.*;
import java.nio.charset.StandardCharsets;

public class TCPClient
{
    public TCPClient()
    {}

    public byte[] askServer(String hostname, int port, byte[] toServerBytes) throws IOException
    {
        Socket clientSocket = new Socket(hostname, port);

        byte[] bufferSize = new byte[1000];

        //send message to the server
        clientSocket.getOutputStream().write(toServerBytes);

        // Query response
        String response;
        // Length of response
        int responseLength;
        StringBuilder sb = new StringBuilder();

        while((responseLength = clientSocket.getInputStream().read(bufferSize)) != -1)
        {
            response = new String(bufferSize, 0, responseLength, StandardCharsets.UTF_8);
            sb.append(response);
        }

        clientSocket.close();
        return sb.toString().getBytes();
    }
  • Related