Android / Java - ClassNotFoundException для соединения ServerSocket и Socket - PullRequest
0 голосов
/ 25 августа 2011

Я занимаюсь разработкой приложения, в котором телефон (программа Android) - это клиент, пытающийся отправить данные через сокет в программу-приемник Java на моем компьютере.

Пока я смог отправитьпростые строки или что-то еще, но сейчас я пытаюсь отправить пользовательские объекты, которые я создаю.Я должен отметить, что обе программы являются отдельными проектами Eclipse, и у меня, похоже, возникают проблемы с включением одного и того же пользовательского класса «Order» на стороне сервера (даже если у меня есть Order.java в папке src проекта сервера).

Некоторый код, для справки: Сервер:

private void run() throws Exception {

    ServerSocket mySS = new ServerSocket(4443);     

    while(true) {

        Socket SS_accept = mySS.accept(); 

        InputStream is = SS_accept.getInputStream();  
        ObjectInputStream ois = new ObjectInputStream(is);  
        Order order = (Order) ois.readObject();  

        if (order!=null){
            java.util.List<String> items = order.getOrders(); 
            int chair = order.getChair();
            int table = order.getTable(); 
            double price = order.getPrice(); 
            System.out.println("Table: "+ table + " || Chair: " +chair);
            for(String food: items) {
                System.out.println(food); 
            }
            System.out.println("Price: $"+price); 

        }  
        is.close();  
        SS_accept.close();  
        mySS.close();

}

И соответствующая часть клиента:

try {
        mySocket = new Socket(serverService.ipAddress, serverService.port);
        os = mySocket.getOutputStream();  
        oos = new ObjectOutputStream(os);  
    } catch(Exception e) {
        Toast.makeText(PlaceOrder.this, "Error - not connected to server.", Toast.LENGTH_SHORT).show(); 
    }

try {
                oos.writeObject(order);
                Toast.makeText(PlaceOrder.this, "Order Submitted!", Toast.LENGTH_SHORT).show(); 
                refreshOrderPage(); //refresh page, allow waiter to make more orders
                oos.close();  
                os.close(); 
                mySocket.close(); 
            } catch (Exception e) {
                Toast.makeText(PlaceOrder.this, "Error - not connected to server.", Toast.LENGTH_SHORT).show();
            } 

Любые идеи, почемуЯ получаю эту ошибку при попытке отправить объекты через сокеты?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 августа 2011

Вы, вероятно, должны установить serialVersionUID в классе, затем создать jar с общими классами и включить этот jar в оба проекта.

Однако, если вы используете разные JVM (Oracle и Dalvik), нет гарантии, что кодировка на уровне байтов одинакова. Вам следует либо вручную переопределить сериализацию, используя readObject / writeObject, либо использовать другую систему кодирования объектов, которая гарантированно идентична независимо от среды.

0 голосов
/ 25 августа 2011

Вы также можете сериализовать объект в некоторый строковый формат (json, yaml, xml) и передать его.Полагаю, было бы гораздо легче поддерживать.

0 голосов
/ 25 августа 2011

Может помочь трассировка стека, но почти наверняка вы сериализуете объект с одной стороны, отправляете его на другую, а у другой стороны нет определения класса, с помощью которого он может восстановить объект. В этом случае может показаться, что ваш сервер не знает о классе com.foo.Order.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...