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

时间:2009-09-23 07:06:46

标签: java sockets object

因此,我一直致力于使用套接字的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 ......

3 个答案:

答案 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)检查您是否正在发送和接收相同的对象类型,以防万一。

祝你好运。