繁体   English   中英

通过Java套接字发送对象的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM