Блоки getInputStream?

#java #multithreading #objectinputstream

#java #многопоточность #objectinputstream

Вопрос:

Использование потока ввода / вывода для передачи объектов между моим клиентом и сервером. Я могу как отправлять, так и получать объекты с моего сервера, и теперь я хочу то же самое для клиента, который на данный момент может только отправлять. Итак, я предоставил своему клиенту ObjectInputStream. Однако, когда я его инициализирую, он блокируется! Искал вокруг и нашел ответы, но решения нет.

Пожалуйста, помогите!

 public GameConnection(String strPort, TextArea chat)
    {
        this.port = Integer.parseInt(strPort);
        System.out.println("GameConnection::Constructor(): Connecting on port "   port);
        this.chat = chat;


        connect = new Connection();
        sendObject();
    }
    public void sendObject()
    {
        try
        {  
            obj_stream.writeObject(new String("GameServer received a message!"));  
        }
        catch(Exception e){System.out.println("GameConnection::sendObject(): "   e);}  
    }  

    protected class Connection extends Thread
    {
        private boolean alive = true;

        public Connection()
        {
            try
            {
                socket = new Socket(host, port);
                System.out.println("Connected to GAMESERVER"   host   " on port   "   port);
                obj_stream = new ObjectOutputStream(socket.getOutputStream());
                // Next line BLOCKS!!!
                //ObjectInputStream stream = new ObjectInputStream(socket.getInputStream());
            }
            catch (IOException ioe)
            {
                System.out.println("Connection::constructor() "   ioe);
                Terminate();
            }
            catch (NullPointerException npe)
            {
                System.out.println("Connection::constructor() "   npe);;
                Terminate();
            }

        }
  

Я пытался использовать их в разных потоках, но у него была та же проблема, по крайней мере, для меня: (

Ответ №1:

да, этот вопрос задавался много раз раньше. формат потока объектов имеет заголовок, и ObjectInputStream считывает этот заголовок при построении. следовательно, он блокируется до тех пор, пока не получит этот заголовок через сокет. предполагая, что ваш клиент / серверный код выглядит аналогично, после создания ObjectOutputStream удалите его. это принудительно передаст данные заголовка по проводу.

Комментарии:

1. Да, я знаю, и я сбрасываю данные с обеих сторон, что приводит меня сюда!

2. Ну, я делал это раньше и попробовал снова. Однако я нашел решение, каким-то образом сокет был поврежден, и там я так и не получил заголовок. Я думаю, плохой код, в любом случае спасибо!