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

  • 相关阅读:
    Java安全之对称加密、非对称加密、数字签名
    Java 设计模式 之 中介者模式(Mediator)
    使用jquery获取radio的值
    java6枚举类型
    java http头信息
    怎样用java生成GUID与UUID
    struts2国际化
    JSON.stringify(),JSON.parse(),toJSON()方法使用
    阻塞队列之六:LinkedBlockingDeque
    jQuery给控件赋值....
  • 原文地址:https://www.cnblogs.com/james1207/p/3301574.html
Copyright © 2011-2022 走看看