我把一个本地文件按字节读然后通过 socket 输出流发送出去,再通过输入流读回来,再把字节拼回个文件。内网没问题都能读完整,但是我通过端口映射,数据通过外国的服务器返回来的数据就丢失了一些,小文件还没问题但是 6m 的文件接收到的就只有 5m 了,麻烦大牛帮我解决一下
1
HelloAmadeus 2018-08-15 22:17:16 +08:00 via Android
socket.recv 不一定会你传入的长度,这种情况考虑了吗?
|
2
HelloAmadeus 2018-08-15 22:26:28 +08:00 via Android
传文件
|
3
ho121 2018-08-15 22:35:00 +08:00 via Android
所以才有了 tcp
|
4
implements OP @HelloAmadeus 不用考虑文件长度啊,只是把文件按字节读出来,然后把所有字节按顺序拼接起来就行了,
|
5
implements OP @ho121 socket 不是基于 tcp 的么?
|
6
HelloAmadeus 2018-08-15 23:42:24 +08:00 via Android
@implements 手机打字,点错就发出去了。你贴一下代码吧,发文件的话,SCP 不是更方便吗?
|
7
changnet 2018-08-16 00:44:00 +08:00 via Android
肯定你代码逻辑有问题,比如发出去 n 字节实际只能发 m 字节但你没处理。
直接给发送接收代码吧,这功能的代码没几行 |
8
msg7086 2018-08-16 00:49:51 +08:00
你说的 socket 是啥东西?
|
9
implements OP @changnet 应该不是能读取并全部发送,内网能完整的接收,逻辑有问题的话应该是不能用的
|
10
lolizeppelin 2018-08-16 01:07:00 +08:00 via Android
贴代码
|
11
CEBBCAT 2018-08-16 06:30:58 +08:00 via Android
……说啥好?咋就那么墨迹呢?内网丢包少,地球上转了一圈有所丢包是可以理解的,楼上要代码就是要看你缓冲区处理好了没有,是不是选了 UDP
|
12
ho121 2018-08-16 08:25:42 +08:00 via Android
@implements 你的逻辑是默认了你所谓的 socket 是 100%可靠的,内网环境可以这么理解,外网环境复杂,就不是这样了,而且你需要考虑断连的问题,你以为下载工具都这么好做
|
13
changnet 2018-08-16 13:00:29 +08:00 via Android
@implements 内网能收完整可能是内网环境好。发几行代码看看不行么
|