Эй, ребята. Я разрабатываю программу клиент/сервер, где клиент является устройством 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();
}
}
}
Спасибо!
Да, вы правы. Он работает только для примитивных типов ... что объясняет, почему он работает со String и т. Д. ... это действительно идиот. Есть ли способ легко преобразовать объект (с примитивными типами и arraylist) в формат, который я могу отправить? – somanys21
** Я нашел проблему ** Это странно, но процесс сериализации смотрит на то, что ** Пакет ** ваш оригинальный класс. Он просто ударил меня, это дало мне ClassNotFoundException. Вот почему, предположим, мой проект Main Server имеет clas XXXX.java в пакете «Экстра». Мой тестовый клиент имеет его в пакете под названием «Main». Это тот же класс XXXX.java, это просто другой пакет. Процесс сериализации фактически учитывает местоположение пакета, а затем отправляет его. Я могу подтвердить это, потому что я сделал свое приложение для Android отличным от моего сервера с точки зрения управления пакетами, и это сработало! – somanys21
Да, имя пакета включено в полное имя класса. Одно и то же имя класса может существовать в разных пакетах. –