我正在写一个简单的"太空入侵者"副本。我想添加网络功能,atm我有写/读数据的问题。所以我有一个(对象)外星人的LinkedList,我想把它发送给客户端,更新他们的位置。
问题从这里开始:
在服务器端,我得到了异常:"java.io.NotSerializableException: sun.awt.image.ToolkitImage"
(类异形实现Serializable)
客户端:'StreamCorruptedException:无效类型代码:AC'
向客户端发送数据的代码:
else if(Server)
{
while(true)
{
ServerSocket server = new ServerSocket(1500);
serverSocket = server.accept();
new NetworkThreadHelp(serverSocket, board.GetAlienList()).start();
}
}
NetworkThreadHelp代码:
public class NetworkThreadHelp extends Thread
{
private Socket socket = null;
private LinkedList<Alien> Aliens = new LinkedList<Alien>();
public NetworkThreadHelp(Socket socket, LinkedList<Alien> A)
{
super("NetworkThreadHelp");
this.socket = socket;
this.Aliens = A;
}
public void run()
{
try
{
ObjectOutputStream objectOutput = new ObjectOutputStream(socket.getOutputStream());
objectOutput.writeObject(Aliens);
objectOutput.flush();
objectOutput.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
数据读取代码:
else if(Client)
{
Socket socket = new Socket("127.0.0.1",1500);
ObjectInputStream objectInput;
while (true)
{
objectInput= new ObjectInputStream(socket.getInputStream());
Object object = objectInput.readObject();//Here code doesn't initialize, everything below this won't execute
LinkedList<Alien> Aliens = (LinkedList<Alien>) object;
board.UpdateAliens(Aliens);
}
}
我的问题是:如何使这个工作,写和读正确?
很可能您的Alien
类包含对不可序列化的ToolkitImage
类的实例的实例引用。您可能需要重构您的代码,使Alien
类不包含这样的实例引用,例如,通过使该引用为静态常数。或者,您可以为Alien
类编写自定义writeObject()
、readObject()
和readObjectNoData()
方法,这些方法在Javadoc中为Serializable
指定。
你的客户端问题可能是也可能不是一个不同的问题,但我建议先解决服务器端问题。如果您仍然有客户端问题,您可以随时发布另一个问题。