Java SimpleClient & SimpleServer Отправка команд странная

Привет мир потока Stackover,

Думал, что отправлю что-нибудь, потому что я не поделился вопросом в течение некоторого времени. Я был довольно озадачен самым странным, возможно, самым простым вопросом из всех, что я находил в Интернете самые разные ответы.

По сути, у меня есть SimpleServer, который выглядит так:

// A generic server that listens on a port and connects to any clients it
// finds. Made to extend Thread, so that an application can have multiple
// server threads servicing several ports, if necessary.

public class SimpleServer
{
    protected int portNo = 8082; // Port to listen to for clients
    protected ServerSocket clientConnect;

    public SimpleServer(int port) throws IllegalArgumentException {
        if (port <= 0)
            throw new IllegalArgumentException(
                    "Bad port number given to SimpleServer constructor.");

        // Try making a ServerSocket to the given port
        System.out.println("Connecting server socket to port...");
        try { clientConnect = new ServerSocket(port); }
        catch (IOException e) {
            System.out.println("Failed to connect to port " + port);
            System.exit(1);
        }

        // Made the connection, so set the local port number
        this.portNo = port;
    }

    public static void main(String argv[]) {
        int port = 8088;
        if (argv.length > 0) {
            int tmp = port;
            try {
                tmp = Integer.parseInt(argv[0]);
            }
            catch (NumberFormatException e) {}

            port = tmp;
        }

        SimpleServer server = new SimpleServer(port);
        System.out.println("SimpleServer running on port " + port + "...");
        server.listen();
    }

    public void listen() {
        // Listen to port for client connection requests.
        try {
            System.out.println("Waiting for clients...");
            while (true) {
                Socket clientReq = clientConnect.accept();
                System.out.println("Got a client...");
                serviceClient(clientReq);
            }
        }
        catch (IOException e) {
            System.out.println("IO exception while listening for clients.");
            System.exit(1);
        }
    }

    public void serviceClient(Socket clientConn) {
        SimpleCmdInputStream inStream = null;
        DataOutputStream outStream = null;
        try {
            inStream = new SimpleCmdInputStream(clientConn.getInputStream());
            outStream = new DataOutputStream(clientConn.getOutputStream());
        }
        catch (IOException e) {
            System.out.println("SimpleServer: Error getting I/O streams.");
        }

        SimpleCmd cmd = null;
        System.out.println("Attempting to read commands...");
        while (cmd == null || !(cmd instanceof DoneCmd)) {
            try { cmd = inStream.readCommand(); }
            catch (IOException e) {
                System.out.println("SimpleServer: " + e);
                System.exit(1);
            }

            if (cmd != null) {
                String result = cmd.Do();
                try { outStream.writeBytes(result); }
                catch (IOException e) {
                    System.out.println("SimpleServer: " + e);
                    System.exit(1);
                }
            }
        }
    }

    public synchronized void end() {
        System.out.println("Shutting down SimpleServer running on port "
                + portNo);
    }
}

Тогда у меня есть SimpleClient, который выглядит так:

public class SimpleClient
{
    // Our socket connection to the server
    protected Socket serverConn;

    // The input command stream from the server
    protected SimpleCmdInputStream inStream;

    public SimpleClient(String host, int port)
            throws IllegalArgumentException {
        try {
            System.out.println("Trying to connect to " + host + " " + port);
            serverConn = new Socket(host, port);
        }
        catch (UnknownHostException e) {
            throw new IllegalArgumentException("Bad host name given.");
        }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }

        System.out.println("Made server connection.");
    }

    public static void main(String argv[]) {
        if (argv.length < 2) {
            System.out.println("Usage: java SimpleClient [host] [port]");
            System.exit(1);
        }

        System.out.println("Getting here");

        String host = argv[0];
        int port=0;
        try {
            port = Integer.parseInt(argv[1]);
        }
        catch (NumberFormatException e) {}

        SimpleClient client = new SimpleClient(host, port);
        System.out.println("Commands are about to send?");

        client.sendCommands();
    }

    public void sendCommands() {
        try {
            OutputStreamWriter wout =
                    new OutputStreamWriter(serverConn.getOutputStream());
            BufferedReader rin = new BufferedReader(
                    new InputStreamReader(serverConn.getInputStream()));

            wout.write("what is a man is a good man\n");
            wout.flush();
            rin.readLine();

            System.out.println("getting here yo");
            // Send a GET command...
            wout.write("GET goodies ");
            // ...and receive the results
            String result = rin.readLine();
            System.out.println(result + "I am here");
            System.out.println("Server says: \"" + result + "\"");

            // Now try a POST command
            wout.write("POST goodies ");
            // ...and receive the results
            result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");

            // All done, tell the server so
            wout.write("DONE ");
            result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");
        }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }
    }

    public synchronized void end() {
        System.out.println("Closing down SimpleClient...");
        try { serverConn.close(); }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }
    }
}

Подключено к целевой виртуальной машине, адрес: "127.0.0.1:64335", транспорт: "сокет" Получение здесь Попытка подключения к локальному хосту 8088 Установлено подключение к серверу. Команды собираются отправить?

Выход подключен к целевой виртуальной машине, адрес: "127.0.0.1:64335", транспорт: "сокет" Получение здесь Попытка подключения к локальному хосту 8088 Установлено подключение к серверу. Команды собираются отправить?

По какой-то причине клиент зависает при "командах, которые собираются отправить", и по какой-то причине не выполняет "запись" в сокет при отправке этих команд на сервер.

Любые подсказки, я что-то упустил, совершенно не в порядке?

Спасибо! Arsalan

1 ответ

Понял, кажется, что когда речь идет о всех типах потоков, писателей, читателей и т. Д., Так много драмы. Похоже, что в моих примерах неправильно использовались типы этих потоков, так как ясное различие заключается в том, что потоки предназначены для всего, что реализует выходной или входной поток, и предназначены для чтения или записи двоичных данных.

Читатели и писатели - это слой над потоками для чтения и записи текста. Читатели и писатели преобразуют двоичные данные из символов в символы, используя кодировку символов.

В основном теперь сделайте это в моем SimpleClient

public class SimpleClient
{
    // Our socket connection to the server
    protected Socket serverConn;

    // The input command stream from the server
    protected SimpleCmdInputStream inStream;

    public SimpleClient(String host, int port)
            throws IllegalArgumentException {
        try {
            System.out.println("Trying to connect to " + host + " " + port);
            serverConn = new Socket(host, port);
        }
        catch (UnknownHostException e) {
            throw new IllegalArgumentException("Bad host name given.");
        }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }

        System.out.println("Made server connection.");
    }

    public static void main(String argv[]) {
        if (argv.length < 2) {
            System.out.println("Usage: java SimpleClient [host] [port]");
            System.exit(1);
        }

        System.out.println("Getting here");

        String host = argv[0];
        int port=0;
        try {
            port = Integer.parseInt(argv[1]);
        }
        catch (NumberFormatException e) {}

        SimpleClient client = new SimpleClient(host, port);
        client.sendCommands();
    }

    public void sendCommands() {
        try {
            DataOutputStream wout =
                    new DataOutputStream(serverConn.getOutputStream());
            DataInputStream rin = new DataInputStream(serverConn.getInputStream());

            // Send a GET command...
            wout.writeChars("GET goodies ");
            // ...and receive the results
            String result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");

            // Now try a POST command
            wout.writeChars("POST goodies ");
            // ...and receive the results
            result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");

            // All done, tell the server so
            wout.writeChars("DONE ");
            result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");
        }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }
    }

    public synchronized void end() {
        System.out.println("Closing down SimpleClient...");
        try { serverConn.close(); }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }
    }
}

Обратите внимание на новый тип потоков вывода и ввода, а не писателей.

Спасибо Арсалан!

Другие вопросы по тегам