因此,我一直致力于使用套接字的java游戏中的2人Tic-Tac-Toe游戏。所有套接字都正常工作,我在2个客户端和服务器之间来回成功发送数据。
我有以下类:Requester,Provider和TBoard(扩展Serializable)。
在Requester(client)类中,我实例化TBoard(TBoard board = new TBoard()
)的对象。
然后我通过套接字将该对象通过输出流发送到我的两个客户端。
我得到的错误是在客户端,它是:Exception in thread "main" java.lang.ClassCastException: java.lang.String
这种情况正在发生:
board = (TBoard) in.readObject(); in:
do {
try {
board = (TBoard) in.readObject();
System.out.println(board.print_board());
} catch (ClassNotFoundException classNot) {
System.err.println("data received in unknown format");
}
我在TBoard类中的print_board()方法是为了返回一个二维数组,但是为了现在(简化目的),我让方法返回字符串“Hello”......
有谁知道为什么会这样?我不想用代码轰炸你们所有人,但如果发布任何更多内容可能会让我知道......
谢谢!
更新:
以下是我使用Provider(服务器)类进行的(更详细的):
// 1. creating a server socket
providerSocket = new ServerSocket(20092);
// 2. Wait for connection
System.out.println("Waiting for connection...");
connection1 = providerSocket.accept();
System.out.println("Connection received from Player 1 " +
connection1.getInetAddress().getHostName());
connection2 = providerSocket.accept();
System.out.println("Connection received from Player 2 " + connection2.getInetAddress().getHostName());
// 3. get Input and Output streams
out = new ObjectOutputStream(connection1.getOutputStream());
out2 = new ObjectOutputStream(connection2.getOutputStream());
in = new ObjectInputStream(connection1.getInputStream());
out.writeObject("Player 1 has been connected successfully.");
in2 = new ObjectInputStream(connection2.getInputStream());
out2.writeObject("Player 2 has been connected successfully.");
out.flush();
out2.flush();
out.writeObject(board);
out2.writeObject(board);
所以我确实在发送最后一个对象(board)之前在流中发送了一个String。但是,我事先正在冲出溪流。我也在刷新后尝试了reset(),它仍然给了我IllegalCastException ......
答案 0 :(得分:3)
IIRC,Exception中提到的类是实际找到的类,因此在您显示的代码中,错误必须在此处:
board = (TBoard) in.readObject();
从流中读取String对象而不是TBoard。
修改强>
所以除了数据之外,你 发送字符串。这是你的问题。您必须在读取数据之前停止发送这些字符串,或在接收端读取它们。调用flush()
与此无关 - 它只是确保您已经写入流的字符串实际上是通过连接发送的,而不是保存在缓冲区中。
答案 1 :(得分:2)
为了调查,我认为最简单的方法是可视化(记录或调试)in.readObject()
产生的实际类。示例代码:
Object o = in.readObject();
System.out.println("Object of class " + o.getClass().getName() + " is " + o);
答案 2 :(得分:1)
有几种可能性。假设您正在使用ObjectOutputStream(我认为您是这样),可能会出现错误,因为您没有完全序列化每个对象。如果每次都不重置流,ObjectOutputStream将尝试重新发送。
我会尝试以下方法:
1)确保在适当的时间刷新()并关闭()套接字
2)尝试在发送每个对象后调用reset()。
3)检查您是否正在发送和接收相同的对象类型,以防万一。
祝你好运。