Java Socket подключен, но не может отправить сообщение с помощью OutputStream.write (), но PrintStream будет работать - PullRequest
0 голосов
/ 05 октября 2019

Я любитель программирования Java-сокетов. Как я сказал в заголовке, когда я использую PrintStream для вывода на сокет, он работает, но он не работает, если я использую просто OutputStream.
Я знаю, что клиент, подключенный к серверу, вызывает, что сервер получилинформация о клиенте. Так что я думаю, что что-то не так с потоком ввода / вывода, а не с сокетным соединением.

Кстати, я даже использую метод flush() для OutputStream. Я думаю flush() принудительно отправит все байты, но похоже, что это не сработало.

Код клиента: @ line 12 :

public class Clinet {

    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("==========Client============");
        Socket socket = new Socket("localhost", 8888);// Server's addr and port
        socket.setSoTimeout(3000);

        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();

        String msgToSent = "Hello TCP";
        outputStream.write(msgToSent.getBytes());
        outputStream.flush();// FIXME:why flush() didn't work?why msg wasn't sent.

        // read from socket input
        String receivedMsg = new String(inputStream.readAllBytes());
        System.out.println(receivedMsg);

        socket.close();
    }

}

Когда я используюпоток фильтра, такой как PrintStream, msg можно отправить на сервер.

Код сервера: при использовании PrintStream он будет отлично работать с клиентом:

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true) {
            Socket client = serverSocket.accept();
            new Thread(new ServerHandler(client)).start();
        }
    }
}

class ServerHandler implements Runnable {
    private Socket client;

    ServerHandler(Socket client) {
        this.client = client;
    }

    @Override
    public void run() {
        try {
            InetAddress clientAddr = client.getInetAddress();
            int clientPort = client.getPort();
            System.out.println("client connected @ " + clientAddr + ":" + clientPort);

            InputStream inputStream = client.getInputStream();
            OutputStream outputStream = client.getOutputStream();

            while (true) {
                String msg = new String(inputStream.readAllBytes());// FIXME: Why Server didn't receive Client's msg?
                System.out.print("/" + clientAddr + "@" + clientPort + " : ");
                System.out.println(msg);

                String reply = "I received " + msg.length() + " words.";// return how many words the server got.
                outputStream.write(reply.getBytes());
                outputStream.flush();// flush to ensure send all msg,but seems doesn't work
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...