Socket通信 C#写服务商 Delphi客户端

来源:互联网 发布:搜狗拼音输入法软件 编辑:程序博客网 时间:2024/05/22 03:52

      摘要: 最近在做Wince开发,搞一个超市卖场采用手持机盘点的现场作业模块。通信部分的实现有两种,其一是通过USB线把数据拷到PDA 上,扫描条码后,查询本地的商品资料库(用SQLite做本地库),盘点完成后再通过USB把盘点结果导入服务器(还是通过读取SQLite库的方式),好处是卖场不需要布局WIFI,减少投资。其二是通过WIFI,建立无线连接,打描条码后,直接读取服务器上的商品资料,盘点数量也直接写入服务器,这样的好处是盘点结果可以实时传到服务器,并且始终能够取得最新的商品资料,减少了盘点前导入商品资料的准备工作。

       下面主要说明下通信部分的编码。

       1、DPA客户端WINCE(主要思路)。

                //定义发送数据缓存
                byte[] data = new byte[1024];
                //定义字符串,用于控制台输出或输入
                string input, stringData;
                input = txt_barcode.Text + "@##";
                //将发送的字符串转换成整型数据并存储在数组中    
                data = CmdResolver.getDataPDGoods(input);  //按定义的数据格式生成内容,发送内容多了换行符“\n”

                _socket.Send(Data);

               //发送完成后等待接收返回的结果

                data = new byte[1024];

                int bytesRec = _socket.Receive(data );

                if (bytesRec == 0)
                {
                    //warning 0 bytes received
                }
                stringData = Encoding.UTF8.GetString(data , 0, bytesRec);

        2、服务端C#

               //接收数据后的处理

              Datagram = Datagram.Replace("\n", "");//将回车符去掉

         3、Delphi客户端(D7+Indy10.5.7)

        var
           data: TIdBytes;
           str: string;
           bytes: integer;
         begin
           if idtcpclnt1.Connected = False then
             idtcpclnt1.Connect('192.163.1.132', 5632);
           str := '16923589447223@12@##';
           data := ToBytes(str, Length(str), 1);//, TIdTextEncoding.UTF8, TIdTextEncoding.UTF8);//编码转换
         
           data[0] := 1; //第一位是命令字
           idtcpclnt1.Socket.Write(data);
           bytes := 10;  //  Utf8ToAnsi
           //str := (  idtcpclnt1.Socket.ReadString(bytes) );  
           str := idtcpclnt1.Socket.ReadLn( TIdTextEncoding.UTF8, TIdTextEncoding.UTF8 );   //结束标记必须是换行符
           str := Utf8ToAnsi(Copy(str, 2, MAXINTATOM));
           ShowMessage(str);

总结:

    1、由于需要与Delphi的通信相匹配,所以C#通信时都增加了换行结束符。

     2、增加了换行结束符的副作用就是C#接收到的内容中多出来一个换行符,所以需要去掉,才出现了在服务端需要替换换行符的情况 Datagram = Datagram.Replace("\n", "")。

   结束语:

       您也可以用  idtcpclnt1.Socket.ReadString()或者  idtcpclnt1.Socket.ReadBytes()来实现接收,但需要提前知道要接收的字节数。那么在服务端要发送数据之前,需要先把

数据长度发给客户端,这对C#客户端是没有任何用处的,并且传字符长度也需要特殊处理。所以我采用了增加结束符的方式来实现异构通信,简单优雅0^0。


0 0