WinCE Socket的陷阱

来源:互联网 发布:java split用法 空格 编辑:程序博客网 时间:2024/05/21 09:10

摘要:

    在做桑达PDA盘点功能。基本功能已经完成,最近想在门店部署WIFI,然后通过WIFI直接也数据库通信,将数据实时存入数据库。一是为了减少盘点结束后再手工导入的麻烦,并节省大量时间。回收一台数据大概需要30秒,这30秒并不是设备慢,而是需要人工拿设备并放在底座上,浪费了太多无功时间。二是为了实时看到盘点结果。在后台能够实时看到盘点结果,分析盘点原因,并且能够知道盘点进度以及还需要多长时间能够完工。

    为了实现这目的。临时的解决方案(测试程序用)是先在资讯室安装WIFI,将PDA拿到资讯室后,再连接WIFI传输数据。彻底的解决方案是在卖场布置WIFI,全面覆盖。

正文:

    软件环境,WinCE5.0,后台VS2008。下面说说在程序测试中遇到的问题。

一、连接服务器后,第一条数据会丢失。

测试数据是21条商品资料, 连接服务器后,开始传输数据。第一次传输,第一条数据总是丢失,变成了20条。再测试第二次传输时,所有数据又都能接收到,一切正常,21条数据全部回收。把同样的代码放在Winform上,在电脑上测试一切正常。

分析原因及解决方法

                1、是TCP连接后立马进行数据传输,TCP把这些数据当成费数据给作废了。解决办法,TCP连接后第一次传输了一条无用的费数据。

                 2、也可能是这时候网络链路还没建立畅通。所以就等待网络,延迟一秒钟。

        两种方法都可以解决问题,但我认为第二种方法是正确的,符合网络工作原理,也更优雅。代码如下

            //定义主机的IP及端口
            ip = IPAddress.Parse(App.Instance().serverip);//172.16.20.11"192.169.1.120"
            //MessageBox.Show(ip.ToString());
            ipEnd = new IPEndPoint(ip, 5632); //5566

            _socket.BeginConnect(ipEnd, connectedCallback, _socket);//异步连接

           byte[] cmd = Encoding.UTF8.GetBytes(dataStr);
            _socket.Send(cmd);//发送

       static void connectedCallback(IAsyncResult iar)//异步连接的回调
        {
                Socket client = (Socket)iar.AsyncState;
                try
                {
                    client.EndConnect(iar);
                }
                catch (Exception e)
                {
                    SockErrorStr = e.ToString();
                }
        }

       文档写到这里突然想到,我的连接方式是异步。那么是否改为同步连接就不存在此问题呢?马上测试,第三个解决办法出来。

              3、采用同步方式与服务器建立连接,于传输数据就不会丢失了。

              将_socket.BeginConnect(ipEnd, connectedCallback, _socket);//异步连接改为

                _socket.Connect(ipEnd); //同步连接

二、服务端断开后再打开,这时客户端开始传数据,显示传输成功,但是服务端一条数据也没有收到。

       原因没有想明白。解决办法是向服务器传输数据后,等待服务顺返回结果。这样当服务没有返回结果时,客户端会报错,就可以强制客户端再连接服务器,完成数据的正确传输。

         int bytesRec = _socket.Receive(readBuffer);
         return Encoding.UTF8.GetString(readBuffer, 0, bytesRec);

         if (readBuffer[0] != OK)
                {
                    MessageBox.Show(goodsInfo[0]);
                    break;//如果失败则停止继续发送
                }

总结:1、与服务器连接最好是同步连接的方式,这样可以等待服务器的反应。当网络状态不好时,尤其重要。

            2、每次发送一定要等待服务器的返回结果,不能看客户端的表象,因为有时候是假象。


0 0
原创粉丝点击