ничего не читает, используя ObjectInputStream в Java сокете - PullRequest
0 голосов
/ 09 марта 2020

Я создал простой сервер и клиент, но сервер не смог прочитать ничего, что было отправлено с клиента. Я также добавляю оператор print после отправки строки, но он также не может быть напечатан.

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

                    Socket clientSocket = serverSocket.accept();
                    System.out.println("accepting client at address " + clientSocket.getRemoteSocketAddress());
                    ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
                    ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());

                    String input = (String) in.readObject();
                    System.out.println(input);
                    out.writeObject("Received");
                    out.flush();
                }
}

Ниже находится клиент, и я просто хочу отправить строку "????? не отправляет":

 public class Test {

        public static void main(String[] args) throws IOException, ClassNotFoundException {
            Client client = new Client();
            client.sentInfo();
        }

        private static class Client {

            private ObjectInputStream objectInputStream;
            private ObjectOutputStream objectOutputStream;

            public Client() throws IOException {
                Socket socket = new Socket("127.0.0.1", 6666);
                this.objectInputStream = new ObjectInputStream(socket.getInputStream());
                this.objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
            }

            public void sentInfo() throws IOException, ClassNotFoundException {
                this.objectOutputStream.writeObject("?????does not send");
                this.objectOutputStream.flush();
                System.out.println("????????");
                Message resp = (Message) this.objectInputStream.readObject();
                System.out.println(resp.getMessage());
            }

        }
 }

Я пробовал что-то еще, если я просто использую InputStream и использую буфер для чтения байтов, например: Код сервера

Это код клиента: код клиента

Код в две ссылки выше будет работать. Тем не менее, это не будет работать, если я попытался использовать ObjectInputStream:

Это сервер: сервер

Это клиент: клиент

Это объект сообщения, который я хочу отправить: Класс сообщения

Может кто-нибудь объяснить мне, пожалуйста? Спасибо!

1 Ответ

0 голосов
/ 09 марта 2020

Для чтения строк из сокета используйте что-то вроде этого:

DataInputStream input = new DataInputStream(clientSocket.getInputStream()); String message = input.readUTF();

Вы можете открыть несколько потоков из сокета, так что если вы хотите прочитать что-то еще, что действительно нуждается в ObjectInputStream, чем он может быть открыт также. Не забудьте правильно закрыть потоки и сокеты.

...