zoukankan      html  css  js  c++  java
  • Socket开发时,Available为0,实际还有数据的问题

    这段时间处理Socket通讯,比如文件传输,通常代码如下:
    string filename = @"c:abc.txt";
    // 发送文件名字符串长度(测试代码,实际请传输字符串字节长度)
    SendLength(socket, filename.Length);
    // 发送文件名字符串
    SendData(socket, filename);
    // 发送文件长度和文件实际内容
    SendFile(socket, filename);

    接收端代码:
    // 在socket的Receive方法前必须明确指明其为阻塞模式
    socket.Blocking = true;
    // 获取文件名长度
    int msgLength = GetLength(socket);
    // 获取指定长度的字符串
    string filename = GetData(socket, msgLength);
    if(socket.Available > 0){
        // 如果还有数据,表示是文件长度和内容,保存它
        GetFile(socket, @"e:saveFile.txt");
    }

    实际运行时,经常出现明明传输了文件,但是Available却为0,导致文件接收失败,
    进行调试,又无法重现这个问题,不调试也经常重现,尤其是2个Socket都在同一机器时,问题更明显。
    后来通过在上述接收代码不断打Console.Write输出日志,终于发现,Available为0时,GetFile也能获取到后续文件数据,
    估计是文件名传输完毕,文件还没发送过来时,另一端就接收完文件名,马上接收文件,导致Available为0了,做了一个最粗糙的处理,就是接收文件前休眠20毫秒,接收端代码如下:
    Thread.Sleep(TimeSpan.FromMilliseconds(20));
    if(socket.Available > 0){
        // 如果还有数据,表示是文件长度和内容,保存它
        GetFile(socket, @"e:saveFile.txt");
    }

    ok,至少目前在我的生产环境未再出现上述问题了,而且通常20毫秒,大家也感觉不到,哈哈,希望你如果有更好的办法,请通知我


    首发:http://beinet.cn

  • 相关阅读:
    idea控制台乱码问题解决
    部署springboot项目到云服务器的两种方式(jar+war)
    case...when...then....(else...)....end的使用小案例
    多线程学习(二)
    多线程学习(一)
    Swagger学习笔记
    Docker进阶篇
    Docker入门基础篇
    Markdown语法学习(推荐使用Typora编辑器)
    git(六)——IDEA中使用git
  • 原文地址:https://www.cnblogs.com/james1207/p/3301574.html
Copyright © 2011-2022 走看看