0

あなたの助けが必要です。

TCP接続を使用して、JavaサーバーとAndroidアプリクライアントの間でTCP接続を確立しています。シリアル化されたオブジェクトを送信するとしますが、クライアント側で毎回コードが Obj = (Person)in.readObject; でブロックされます。ここで、in はデータ オブジェクトinputstream であり、Person はシリアル化されたオブジェクトです。

ただし、文字列または文字列である整数を送信している場合、コードは機能しており、そのために Obj = in.readObject; を使用します。直接

したがって、逆シリアル化を成功させるために何を追加できるかを知る必要があります。

または、配列リストが文字列のみである可能性があるため、私は何をしていると思いますか


クライアント 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();
    }
4

1 に答える 1

0

ここにいくつかの問題があります。

まず、readObject() は EOS で null を返さないため、ループ条件が間違っています。EOFException がスローされるため、それをキャッチする必要があります。

第 2 に、受信したオブジェクトに対する toString() の結果だけが必要な場合、シリアル化を使用している理由がまったくわかりません。

第 3 に、あなたのコードには FileNotFoundException をスローするものは何もないので、なぜそれをキャッチしているのかは謎です。

第 4 に、受け取ったオブジェクトが Person のインスタンスでない場合、コードがそれを示すことはありません。

于 2013-06-25T11:01:23.187 に答える