通过DatagramChannels发送和接收对象

时间:2017-01-04 17:08:59

标签: java serialization objectoutputstream bytearrayoutputstream bytearrayinputstream

我遇到ByteArrayInputStream + ObjectInputStream(以及相应的输出流)的问题。

我想通过UDP通道编写类 1 2 3 4 1 2.091 0.918 0.9 1.718 2 0.647 0.964 0.6 2.264 3 0.804 0.789 0.6 1.9 的一些(不同的)实例,并且我已经设法通过这种方式:

撰写时(Pairthis.scoresHashMap<String, Integer>this.completed(假设此ArrayList<String>在本例中为2))

size()

阅读(for(String userWhoCompleted : this.completed) { try(ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos);) { oos.writeUnshared(new Pair<String, Integer>(userWhoCompleted, this.scores.get(userWhoCompleted))); oos.flush(); this.resultChannel.write(ByteBuffer.wrap(baos.toByteArray())); } catch(IOException e) { e.printStackTrace(); } } buf

ByteBuffer

使用此代码,我可以正确读取在通道上写入的所有2个对象。

但正如您所看到的,我必须在每个新的循环周期中创建while(scoresReceived != 2) { // 2 is temporary buf.clear(); try { this.multicastChannel.receive(buf); } catch(IOException e) { e.printStackTrace(); } try(ByteArrayInputStream bais = new ByteArrayInputStream(buf.array(), 0, buf.position()); ObjectInputStream ois = new ObjectInputStream(bais);) { Pair<String, Integer> result = (Pair<String, Integer>) ois.readUnshared(); System.out.println(result); } catch(IOException | ClassNotFoundException e) { e.printStackTrace(); } } baosoosois的新实例。 我尝试在循环外创建这些对象,然后分别在服务器和客户端执行bais + oos.writeUnshared(baos.toByteArray)baos.reset(),但在阅读时我得到readUnshared。如果我删除StreamCorruptedException: invalid stream header,我总是读同一个对象,这是第一个写入baos.reset()的对象。 我做错了什么?这是解决这些问题的唯一方法吗?

PS:课程oosPair

Serializable

0 个答案:

没有答案