7

Эй, ребята. Я разрабатываю программу клиент/сервер, где клиент является устройством Android. Сервер имеет класс слушателя, который считывает объект из входного потока. Я создал клиентское программное обеспечение для другого компьютера, который отправляет небольшой объект по локальной сети. Компьютер к компьютеру отлично работает, я прочитал объект и распечатал его. Тем не менее, SAME код, перенесенный на android (я переписал его на всякий случай) не работает. Я создаю объект (ЛЮБОЙ объект), который является сериализуемым и отправляет его через ObjectOutputStream. Мой сервер, работающий на компьютере, подключается к устройству, но он дает мне исключение ClassNotFound, даже если im печать объекта (который имеет toString). Как я уже сказал, тот же код, запущенный на другом компьютере (как .jar-файл), отлично работает.Android Socket + ObjectOutputStream работает неправильно

Это действительно странная часть, если я отправляю логическое или String (из устройства), это работает ... только мои «пользовательские» объекты, которые не делают. Я предполагаю, что это будет работать для любого «стандартного» Java-объекта.

Если вы нашли ошибку, имейте в виду, что код действительно работает, но только с другого компьютера на компьютер ... а не на Android-устройство на компьютер. Если вы все-таки найти другую вопиющую ошибку, то удивительным :)

ANDROID ПРОГРАММА:

package WaitDroid.Main; 

import java.io.ObjectOutputStream; 
import java.net.InetAddress; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class main extends Activity { 
/** Called when the activity is first created. */ 
private Button a; 
private TextView x; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    this.a = (Button) this.findViewById(R.id.Send_Order); 
    this.x = (TextView) this.findViewById(R.id.TextView1); 
    this.a.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View arg0) 
     { 
      sendMenu(); 
     } 
    }); 
} 

private void sendMenu() 
{ 
    try 
    { 
     InetAddress serverAddress = InetAddress.getByName("128.153.180.109"); 
     Socket socket = new Socket(serverAddress, 4322); 
     ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); 
     TestObject send = new TestObject("Hi", 32); 
     out.writeObject(send); 
     out.close(); 
     socket.close(); 
     } 
     catch(Exception e) 
     { 
     x.setText(e.getMessage()); 
     } 
    } 
} 

ТЕСТ ОБЪЕКТА:

package WaitDroid.Main; 

import java.io.Serializable; 

public class TestObject implements Serializable 
{ 
    private String name; 
    private int number; 

    public TestObject(String a, int b) 
    { 
     name = a; 
     number = b; 
    } 

    public String toString() 
    { 
     return name +" - "+ number; 
    } 
} 

SERVER СЛУШАТЕЛЬ:

package Main; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectInputStream.GetField; 
import java.net.ServerSocket; 
import java.net.Socket; 

import Order.Order; 

public class ServerListener extends Thread 
{ 

    public void run() { 
     try { 
      ServerSocket listen = new ServerSocket(4322); 

      while (true) { 
       Socket socket = listen.accept(); 
       String clientInetAddr = socket.getInetAddress().toString(); 
       ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); 

       System.out.println("Connected to: " + clientInetAddr); 

       try 
       { 
        Object a = in.readObject(); 
        System.out.println(a); 
        //RestaurantServerRun.n.server.addOrder(a); 
       } 

       catch(IOException e) 
       { 
        System.err.println(e.getMessage()); 
       } 

       in.close(); 
       socket.close(); 
      } 
     } 
     catch (Exception e) { 
      System.err.println("Error in run()"); 
      e.printStackTrace(); 
     } 

    } 
} 

Спасибо!

ответ

4

Я подозреваю, что формат сериализации Android может быть несовместим с форматом Java VM. Можете ли вы попробовать преобразовать свои объекты в XML или какой-либо другой текстовый формат?

+0

Да, вы правы. Он работает только для примитивных типов ... что объясняет, почему он работает со String и т. Д. ... это действительно идиот. Есть ли способ легко преобразовать объект (с примитивными типами и arraylist) в формат, который я могу отправить? – somanys21

+4

** Я нашел проблему ** Это странно, но процесс сериализации смотрит на то, что ** Пакет ** ваш оригинальный класс. Он просто ударил меня, это дало мне ClassNotFoundException. Вот почему, предположим, мой проект Main Server имеет clas XXXX.java в пакете «Экстра». Мой тестовый клиент имеет его в пакете под названием «Main». Это тот же класс XXXX.java, это просто другой пакет. Процесс сериализации фактически учитывает местоположение пакета, а затем отправляет его. Я могу подтвердить это, потому что я сделал свое приложение для Android отличным от моего сервера с точки зрения управления пакетами, и это сработало! – somanys21

+1

Да, имя пакета включено в полное имя класса. Одно и то же имя класса может существовать в разных пакетах. –

Смежные вопросы