关于TCP中文件传输阻塞问题的原因及解决方案和相关优化。

    **## 在自学java过程中遇到的一些问题**

来自b站java课程

  1. 对于如图所示——文件传输示例:由客户端读取本机文件并上传至服务器,服务器进行读取后保存到服务器硬盘上。

  2. 但此过程中易出现阻塞问题,即客户端和服务器端在文件传输完成后不会停止,陷入阻塞,从而导致while循环后面的内容无法编译运行。
    导致问题的原因,本人认为并不是老师所讲的客户端服务器端都无法读取while中的-1,而是客户端读取到-1之后直接退出循环,停止向服务器端输出,导致服务器端whlie循环陷入死循环,从而阻塞。

  3. 解决方法:
    我们可以找到这样一个方法void shutdownOutput() 用于禁用此套接字的输出流; 所以我们在客户端while循环结束,即上传完文件后,写入这样一个方法,对于TCP套接字,任何先前写入的数据将被发送,随后是TCP的正常连接终止序列,即自动写入终止序列。


优化

当然,为了防止文件名覆盖问题,我们可以自己定义命名规则

  •           //域名+毫秒值+随机数*
    
String filename="itcast"+System.currentTimeMills()+new random().nextInt(9999)+".jpg";

以及令服务器端accept进行死循环,能够一直处于监听状态
另外可以使用线程来提高效率:

new Thread(new Runnable(){
    @Override
    public void run(){
      //上传文件相关代码
}
    }
).start();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值