思科模拟器服务器重置连接,TCP连接重置的一个简单的解决方法,服务器客户端均适用...

在Java Socket编程中遇到的第一个包能送达,第二个包导致连接重置的问题,通常由于数据过大被TCP分片。解决方法是采用多线程,分别创建InputThread和OutputThread,并使用NetStatus类同步数据读写状态。通过ByteArrayInputStream和ByteArrayOutputStream处理数据,确保读写操作不会阻塞。这种方法避免了依赖开源库,实现了纯Socket通信的稳定传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java的Socket编程中,我们经常会遇到第一个包对方可以收到,第二个包就连接重置,这其实是因为对方第二个包的数据过大被TCP分开了,然后对方接收到了第一个包,导致read阻塞结束,然后程序结束,Socket关闭很巧的是,up在开发CraftGame的时候也遇到了同样的问题,在网络上找了很多方法,其中很多都是用各种开源库,比如apache的库,而up是纯Socket编程,那我们该怎么办呢?答案就是:多线程,就输入输出各一个线程,然后用一个类似NetStatus的东西记录要读取的数据长度和读取到的数据还有要写出去的数据,然后写一个getData方法,如果数据不为null则返回数据,那么怎么实现呢?下面up就来分享一下up的具体实现

写一个输入线程和输出线程,我们暂时把他叫做InputThread和OutputThread,还有一个储存各种状态的类,我们暂时把他叫做NetStatus,然后里面声明一些变量,因为是多线程,所以为了避免数据不能及时更新,所以我们要用volatile修饰变量,然后InputThread要获取NetStatus里面的输入长度,然后读对应的长度,记住读的操作要在循环的末尾,不然会阻塞线程无法返回数据。然后每读一个字节在NetStatus的标记里面+1,直到标记大于或等于输入长度,就输出数据到NetStatus的数组里面(用完赋值为null),如果只要指定长度的数据呢?用ByteArrayInputStream实现就可以了

那么在输出到NetStatus的数组之前数据存在哪里呢?ByteArrayOutputStream,向里面写数据,别忘了reset方法,把数据和标记清空(不会把NetStatus的字节数组清空)OutputThread很简单,写NetStatus的输出数组就行了,就是要标记一下写没写,如果写过了就不写,然后用这种方法代替直接读写吧!希望这种方法能帮到你们

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值