CP连接和使用ObjectInputStream接收数据

时间:2013-06-20 09:41:57

标签: java android serialization deserialization objectinputstream

我需要你的帮助。

我正在使用TCP连接在java服务器和Android应用程序客户端之间建立TCP连接。 假设我将发送一个序列化对象,但是每次在客户端,代码都被阻止在Obj =(Person)in.readObject;其中in是数据objectinputstream,Person是序列化对象。

但是,如果我发送字符串或整数是字符串,代码正在工作,我用于Obj = in.readObject;直接

所以,我需要知道我能添加什么才能成功反序列化。

或者可能是arraylist只是字符串,所以我想做什么


客户端Android代码

    lst = (ListView) findViewById(R.id.list);    
         al = new ArrayList<String>();    
         ad = new ArrayAdapter<String>(this,R.layout.list, al);

try { 
      socket = new Socket("192.168.0.103", 8888);
      in = new ObjectInputStream(socket.getInputStream());
      Object obj = null;  
      while ((obj = in.readObject()) != null) {  
          if (obj instanceof Person) {    
    al.add(((Person) obj).toString());

    lst.setAdapter(ad);
    }}      

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

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

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

    finally{
      if (in != null){

    try {
        in.close();

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

Java服务器代码

try {
   socket = serverSocket.accept();

oos = new ObjectOutputStream(socket.getOutputStream());

Person person = new Person();

person.setFirstName("James");

    person.setLastName("Ryan");

    person.setAge(19);

    String a = "Ahmed";

    oos.writeObject(a);

    oos.writeObject(person);  

   } catch (FileNotFoundException ex) {
       ex.printStackTrace();

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

   }
   finally{

    if( oos!= null){

     try {
        oos.flush(); 
      oos.close();
     } catch (IOException e) {
      e.printStackTrace();
     }

序列化对象

public class Person implements Serializable {

    private String firstName;
    private String lastName;
    private int age; 
    public Person() {
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
       public String toString() {

        StringBuffer buffer = new StringBuffer();
        buffer.append(firstName);
        buffer.append("\n");
        buffer.append(lastName);
        buffer.append("\n");
        buffer.append(age);
        buffer.append("\n");

        return buffer.toString();
    }

1 个答案:

答案 0 :(得分:0)

这里有几个问题。

首先,readObject()在EOS时不返回null,因此循环条件错误。它抛出EOFException,所以你需要抓住它。

其次,我不知道你为什么要使用序列化,如果你想要的只是接收对象上的toString()的结果。

第三,你的代码中没有任何东西抛出FileNotFoundException,所以你为什么要捕获它是一个谜。

第四,如果收到的对象不是Person的实例,那么你的代码就无法表现出来。