Tag: objectinputstream

为什么ObjectInputStream readObject()抛出EOFexception

我对这个非常奇怪的问题感到困惑。 在客户端我传递的对象是 try{ oos.writeObject(new GameStartSerializedObject()); oos.flush(); } catch(Exception e){ e.printStackTrace(); } 在服务器中我正在读取对象 try{ //Its my turn thrown_message = player_reader.readObject(); } catch(Exception e){ 我的问题是为什么我得到EOF例外。 我对对象输入流的理解是当我调用readObject()时我应该阻塞直到我得到一个对象,那么它如何知道是否到达了eof? 请帮忙! 这就是我创建对象流的方式 ois = new ObjectInputStream(socket.getInputStream()); oos = new ObjectOutputStream(socket.getOutputStream()); oos.flush(); 此外,在我写对象和刷新后,我应该关闭流。 我没有关闭它,因为对象是从代码的不同部分一个接一个地定期编写的。

Object中的ObjectInputStream readObject

是否可以在while循环中读取ObjectInputStream ,它将由socket超时socket.setSoTimeout(4000);抛出的exception终止socket.setSoTimeout(4000); while(Object obj = ois.readObject()) { <– Not Working //do something with object }

Java – 使用ObjectInputStream监听套接字

好的,我有一个名为’Client’的线程类,每次服务器接受它创建一个新Client的连接…. run方法监听来自客户端的消息,我正在使用ObjectInputStream .. do { ObjectInputStream in = null; try { in = new ObjectInputStream(socket.getInputStream()); String message = (String) in.readObject(); System.out.println(message); } catch (ClassNotFoundException ex) { isConnected = false; System.out.println(“Progoramming Error”); } catch (IOException ex) { isConnected = false; System.out.println(“Server ShutDown”); System.exit(0); } } while(isConnected); 我遇到的问题是,为什么每次循环时都必须创建一个新的ObjectInputStream …如果我在循环结束时关闭输入流并再次循环另一条消息,我将收到错误…请一些帮助

如何附加到现有的java.io.ObjectStream?

至于现在,当我尝试追加一个Object时,我会得到java.io.StreamCorruptedException 。 我在互联网上搜索了一种克服这种情况的方法。 到目前为止我找到的答案是无法完成的。 解决此问题的方法是将对象写入列表,然后将列表写入文件。 但是每次添加新对象时我都要覆盖该文件。 它似乎不是加class的最佳解决方案。 有没有办法将对象附加到现有的对象流?

Java套接字编程

我正在使用java套接字构建一个简单的客户端/服务器应用程序并尝试使用ObjectOutputStream等。 我一直在关注这个教程http://java.sun.com/developer/technicalArticles/ALT/sockets ,当它谈到通过套接字传输对象时开始。 请参阅我的客户端代码http://pastebin.com/m37e4c577然而,这似乎不起作用,我无法弄清楚什么是不起作用。 底部注释掉的代码直接从教程中复制出来 – 当我只使用它而不是创建客户端对象时,这个工作正常。 谁能看到我做错了什么?

(java)ObjectInputStream反序列化错误版本的对象

我只是从java书中学习网络,所以我有点像菜鸟。 我无法在书中或网上找到这个问题所以我决定问互联网。 该书说使用ObjectOutputStream和ObjectInputStream来发送和接收不同控制台的对象。 现在,我能够成功接收我发送的对象 – 但只能一次。 当我发送不同的对象:随机字符串和整数和无名实例时,控制台具有所有正确的字段。 但是当我发送一个对象的实例时,更改其中一个实例的字段的值,然后重新发送该对象,然后inpustream会加载原始实例的值。 所以,例如,我有一个类的实例,其公共int“var”等于1.如果我发送此类的实例,客户端会收到它并正确报告var = 1.但是,如果我更改var到2(在同一个实例中)并重新发送它,客户端将完成调用read()方法(因此它必须已经接收到新对象!),但它会将var报告为1.如果我将实例发送到一个尚未收到实例的不同客户端,它会正确地将var报告为2,即使我更改了var,它也会继续将其报告为2。 如果客户端之前没有收到该实例的正确版本,则该事实必须意味着该对象正在通过输出流正确发送; 由于某种原因,输入流不起作用。 它几乎就像它看到它是相同的对象所以它假定它具有相同的值而不检查。 为什么会发生这种情况,我该如何解决? 对不起,如果我问一些愚蠢的东西 – 这本书没有解释序列化和套接字如何工作,只是如何使用它们,所以我很可能从根本上对如何使用它们感到困惑。 谢谢! 我编写的简单代码来测试问题: 服务器:(有一个计时器动作来继续发送更新的对象) public void actionPerformed(ActionEvent e) { object.var++; output.write(object); output.flush(); System.out.println(object.var); } 客户 public void run() { while(true) { Test t = (Test)input.readObject(); System.out.println(t.var); } } 当这些程序运行时,Server类的输出是1,2,3,4 ……无限增加,而Client的输出只有1,1,1,1,1,1,1等。 感谢您抽出时间来阅读。 对不起,如果我只是愚蠢,我是这个东西的新手。 编辑:对不起,read()是一个错误的类型(我手动输入代码因为我无法正确格式化),我的意思是input.readObject()

新的ObjectInputStream()块

public class SerProg { static ServerSocket ser=null; static Socket cli=null; static ObjectInputStream ins=null; static ObjectOutputStream outs=null; public static void main(String[] args) { try { ser=new ServerSocket(9000,10); cli=ser.accept(); System.out.println(“Connected to :”+cli.getInetAddress().getHostAddress()+” At Port :”+cli.getLocalPort()); ins=new ObjectInputStream(cli.getInputStream()); outs=new ObjectOutputStream(cli.getOutputStream()); String str=(String)ins.readObject(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 和客户 public […]