ObjectInputStream与ObjectOutputStream的顺序问题

背景:正在阅读《NIO与Socket编程技术指南》一书,在书中看到作者特别标注了 Server端和Client端ObjectInputStream 和 ObjectOutputStream 的创建顺序。我很疑惑,难道顺序有要求吗?找找看!
先简单测试一下

第一种情况,Server端和Client端都是生成ObjectInputStream 在前,ObjectOutputStream 在后。

Server端:
在这里插入图片描述
Client端:
在这里插入图片描述
结果:
在这里插入图片描述
这说明client已经连上了,但是都阻塞了。为什么阻塞最后再说!

第二种情况,Server端和Client端都是生成 ObjectOutputStream在前,ObjectInputStream在后。

图就算了!请尽情脑补!
结果:
Server端:
在这里插入图片描述
Client端:
在这里插入图片描述
Server端和Client端都收到了对方亲切的问候(数据)。

第三种情况,Sever端和Client端,ObjectInputStream的生成顺序相反。

比如:
Sever端:

        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);

Client端:

		ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
		ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);

结果:
Server端:
在这里插入图片描述
Client端:在这里插入图片描述
结果和第二种方式一致。双方进行了密切的交流(数据)。
OK,来点实际的!上面这一堆并没有说一个为什么,下面就来说说为什么

	public ObjectInputStream(InputStream in) throws IOException {
        verifySubclass();
        bin = new BlockDataInputStream(in);
        handles = new HandleTable(10);
        vlist = new ValidationList();
        serialFilter = ObjectInputFilter.Config.getSerialFilter();
        enableOverride = false;
        readStreamHeader();    // 这里,就是这里
        bin.setBlockDataMode(true);
    }

进入readStreamHeader方法瞅瞅

	protected void readStreamHeader()
        throws IOException, StreamCorruptedException
    {
        short s0 = bin.readShort();  // 注意这里
        short s1 = bin.readShort(); //  还有这里
        if (s0 != STREAM_MAGIC || s1 != STREAM_VERSION) {   // 这里将获得的两个数据进行校验
            throw new StreamCorruptedException(
                String.format("invalid stream header: %04X%04X", s0, s1));
        }
    }

继续进入,其实不必进入了,在里面也是对数据的处理,这里就是一个读操作。
可以理解为创建一个ObjectInputStream 需要从对面读数据。如果两边都先创建ObjectInputStream的话,哪有数据写入,不堵才怪!

	public ObjectOutputStream(OutputStream out) throws IOException {
        verifySubclass();
        bout = new BlockDataOutputStream(out);
        handles = new HandleTable(10, (float) 3.00);
        subs = new ReplaceTable(10, (float) 3.00);
        enableOverride = false;
        writeStreamHeader();   //  就是这里,写数据的那个地方
        bout.setBlockDataMode(true);
        if (extendedDebugInfo) {
            debugInfoStack = new DebugTraceInfoStack();
        } else {
            debugInfoStack = null;
        }
    }

看看写了什么(两个数据,一个不差):

	protected void writeStreamHeader() throws IOException {
        bout.writeShort(STREAM_MAGIC);  // Magic number that is written to the stream header.
        bout.writeShort(STREAM_VERSION); //  Version number that is written to the stream header.
    }

简而言之,就是一个read等数据问题。write写了,自然没问题,没写,可不就得等着嘛(阻塞)。

最后,
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值