[英]Question with sending object over java sockets
所以我一直在研究一个使用套接字的2人Tic-Tac-Toe游戏。 所有套接字都正常工作,我在2个客户端和服务器之间来回成功发送数据。
我有以下类:请求者,提供者和TBoard(扩展Serializable)。
在Requester(客户端)类中,我实例化了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 ...
IIRC,Exception中提到的类是实际找到的类,因此在您显示的代码中,错误必须在此处:
board = (TBoard) in.readObject();
并且从流中读取String对象而不是TBoard。
编辑:那么,你是除了数据发送字符串。 这是你的问题。 您必须在读取数据之前停止发送这些字符串,或在接收端读取它们。 调用flush()
与此无关 - 它只是确保您已经写入流的字符串实际上是通过连接发送的,而不是保存在缓冲区中。
为了研究,我认为最简单的方法是可视化(记录或调试)由in.readObject()
产生的实际类。 示例代码:
Object o = in.readObject();
System.out.println("Object of class " + o.getClass().getName() + " is " + o);
有几种可能性。 假设您正在使用ObjectOutputStream(我认为您是这样),可能会出现错误,因为您没有完全序列化每个对象。 如果每次都不重置流,ObjectOutputStream将尝试重新发送。
我会尝试以下方法:
1)确保在适当的时候冲洗()并关闭()套接字
2)尝试在发送每个对象后调用reset()。
3)检查您是否正在发送和接收相同的对象类型,以防万一。
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.