摘要:
在做桑达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、每次发送一定要等待服务器的返回结果,不能看客户端的表象,因为有时候是假象。