V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
implements
V2EX  ›  问与答

socket 读取文件不完整

  •  
  •   implements · 2018-08-15 22:12:01 +08:00 via Android · 1542 次点击
    这是一个创建于 2051 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我把一个本地文件按字节读然后通过 socket 输出流发送出去,再通过输入流读回来,再把字节拼回个文件。内网没问题都能读完整,但是我通过端口映射,数据通过外国的服务器返回来的数据就丢失了一些,小文件还没问题但是 6m 的文件接收到的就只有 5m 了,麻烦大牛帮我解决一下

    13 条回复    2018-08-16 13:00:29 +08:00
    HelloAmadeus
        1
    HelloAmadeus  
       2018-08-15 22:17:16 +08:00 via Android
    socket.recv 不一定会你传入的长度,这种情况考虑了吗?
    HelloAmadeus
        2
    HelloAmadeus  
       2018-08-15 22:26:28 +08:00 via Android
    传文件
    ho121
        3
    ho121  
       2018-08-15 22:35:00 +08:00 via Android
    所以才有了 tcp
    implements
        4
    implements  
    OP
       2018-08-15 22:56:42 +08:00 via Android
    @HelloAmadeus 不用考虑文件长度啊,只是把文件按字节读出来,然后把所有字节按顺序拼接起来就行了,
    implements
        5
    implements  
    OP
       2018-08-15 22:57:30 +08:00 via Android
    @ho121 socket 不是基于 tcp 的么?
    HelloAmadeus
        6
    HelloAmadeus  
       2018-08-15 23:42:24 +08:00 via Android
    @implements 手机打字,点错就发出去了。你贴一下代码吧,发文件的话,SCP 不是更方便吗?
    changnet
        7
    changnet  
       2018-08-16 00:44:00 +08:00 via Android
    肯定你代码逻辑有问题,比如发出去 n 字节实际只能发 m 字节但你没处理。

    直接给发送接收代码吧,这功能的代码没几行
    msg7086
        8
    msg7086  
       2018-08-16 00:49:51 +08:00
    你说的 socket 是啥东西?
    implements
        9
    implements  
    OP
       2018-08-16 01:04:32 +08:00 via Android
    @changnet 应该不是能读取并全部发送,内网能完整的接收,逻辑有问题的话应该是不能用的
    lolizeppelin
        10
    lolizeppelin  
       2018-08-16 01:07:00 +08:00 via Android
    贴代码
    CEBBCAT
        11
    CEBBCAT  
       2018-08-16 06:30:58 +08:00 via Android
    ……说啥好?咋就那么墨迹呢?内网丢包少,地球上转了一圈有所丢包是可以理解的,楼上要代码就是要看你缓冲区处理好了没有,是不是选了 UDP
    ho121
        12
    ho121  
       2018-08-16 08:25:42 +08:00 via Android
    @implements 你的逻辑是默认了你所谓的 socket 是 100%可靠的,内网环境可以这么理解,外网环境复杂,就不是这样了,而且你需要考虑断连的问题,你以为下载工具都这么好做
    changnet
        13
    changnet  
       2018-08-16 13:00:29 +08:00 via Android
    @implements 内网能收完整可能是内网环境好。发几行代码看看不行么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3080 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:45 · PVG 20:45 · LAX 05:45 · JFK 08:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.