ObjectInputStream и getInputStream

Я работаю над школьным проектом, и следующие коды - пример, предоставленный для построения проекта (должен работать без проблем, но не...). Не было ошибки компиляции, но когда я использую telnet для тестирования, появляется следующее сообщение:

java.io.StreamCorruptedException: invalid stream header: 56543130 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
    at ThreadedDataObjectHandler.run(ThreadedDataObjectServer.java:41)

Строка 41

ObjectInputStream in =new ObjectInputStream(incoming.getInputStream());

Вот мои коды:

import java.io.*;
import java.net.*;
import java.util.*;
public class ThreadedDataObjectServer {  
    public static void main(String[] args ) {  

      try 
  {  ServerSocket s = new ServerSocket(3000);

     for (;;)
     {  Socket incoming = s.accept( );
        new ThreadedDataObjectHandler(incoming).start();

     }   
  }
  catch (Exception e) 
  {  e.printStackTrace();
      } 
   } 
}

class ThreadedDataObjectHandler extends Thread
{
DataObject myObject = null;
private Socket incoming;
private String greeting="Hello!";
public ThreadedDataObjectHandler(Socket incoming) 
   { 
        this.incoming = incoming;
   }

   public void run()
   {  try 
      {     

    ObjectInputStream in =new ObjectInputStream(incoming.getInputStream());

    ObjectOutputStream out =new ObjectOutputStream(incoming.getOutputStream());

    myObject = (DataObject)in.readObject();

    System.out.println("Message read: " + myObject.getMessage());

    myObject.setMessage("Got it!");

    System.out.println("Message written: " + myObject.getMessage());


    out.writeObject(myObject);

    in.close();

    out.close();

    incoming.close();    

  }
  catch (Exception e) 
  {  e.printStackTrace();
  } 
   } 
}
class DataObject implements Serializable{
    protected String message;
    public DataObject(){
        message="";
    }
public void setMessage(String m){
    message=m;
}
    public String getMessage(){
    return message;
    }
}

Я попытался изменить порядок утверждений. ObjectInputStream in=... а также ObjectOutputStream out=... но не повезло. Пожалуйста, помогите... спасибо.

2 ответа

Из того, что я понял из комментариев, вы пытаетесь прочитать объекты из соединения telnet, используя ObjectInputStream.

Тебе этого не сделать. Если вы собираетесь использовать ObjectInputStream, тогда вам нужна другая соединительная программа для написания с использованием ObjectOutputStream.

Ваш клиент telnet действительно не заботится о Java ObjectOutputStream, ObjectInputStream и Сериализации.

Поэтому я бы попробовал что-то вроде InputStreamReader, обернутого в BufferedReader.

Если вы просто хотите проверить соединение, просто напишите небольшую Java-программу, которая будет подключаться к вашей программе вместо использования telnet.

Дэвид, как я уже упоминал в комментариях, вы должны написать клиент, который использует ObjectOutputStream для отправки того же объекта DataObject на сокет сервера.

Так как вы ожидаете DataObject, клиент должен отправить DataObject. Когда вы используете telnet, он подключается, но оттуда вы не можете отправить DataObject так, как это понимает поток Java-объектов.

Пожалуйста, смотрите http://zerioh.tripod.com/ressources/sockets.html для примера сервера / клиента.

Кроме того, так как некоторые школьные упражнения пытаются понять концепцию, а не просто копировать.

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