• (转)Socket开发时,Available为0,实际还有数据的问题


    本文转载自:http://blog.csdn.net/youbl/article/details/11067369

    这段时间处理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毫秒,大家也感觉不到,哈哈,希望你如果有更好的办法,请通知我

  • 相关阅读:
    ASP通过ADODB读取Access数据库
    Android中日期函数Calendar的一些用法和注意事项
    Android中Activity加入Fragment使用注意事项及常用技巧
    SQLite常用函数
    Linux下svn的安装与部署
    SpringMVC+MyBatis+MySQL 8小时链接断开
    教你怎么玩数独
    Eclipse3.2查找jre的问题
    java的集合框架
    第N次学习javaIO之后
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/3912826.html
Copyright © 2020-2023  润新知