java socket readline 阻塞_java Socket readLine() 阻塞

1,当使用调用 在服务器端调用readLine()的时候,客户端就如果调用的是print()方法就会卡住,而且不会报错,改成println() 就会畅通!

2,如果 socket端

while()循环读取文件并写入输出 流

而 ServerSocket端 while(readLine()!=null) 这样写也会卡住,  ServerSocket端 此时读的是流  会一直等待输入,而不会读取到null ,除非你在socket 端的循环结束后,刻意写入null

如何控制控制read()读取呢?  假如缓冲区的大小是1024位,

模拟上传文件(纯属个人思路,刚学习,没有经验,请担待),

1,要先发送文件名,像我们上传到百度云的文件名 是不是和我们在本地的文件名字是不是一样的? 所以要先发送文件名字,让服务端先收到名字,然后再根据名字判断是否有重名

然后在发送文件.

2,按照思路,就是先发送文件名,服务端接收,然后客户端再发送文件.服务端再接收.这个中间就会产生问题,一般情况下,我们的一个文件名字怎么也不会达到1024位把? 但是服务器端在读取的时候,直到缓冲区读满,才会结束,服务端是读取不到-1的,所以服务器端为了读满缓冲区,即会一直等到文件内容传输的时候,读取文件的内容在填充缓冲区,作为文件名字,这时候如果你不注意的话,就会产生很多的乱码.即使上传成功,文件也打开,因为部分文件内容被读取到文件名中了.所以文件名字也是乱码.

解决办法:

1,在服务端第一次读取之后设置超时 setSoTimeout(10);捕获异常SocketException,不要抛出.

2,在客户端第一一次发送结束后设置Thread.sleep(10); 由于此处的休眠,导致服务端在10毫秒内读取不到内容,从而导致其超时.

3,在服务端的超时触发之后,就会结束本次读取. 即可以读取到正确的文件名字了.

4,接着就可以正确的上传文件了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值