Socket通信 C#寫服務商 Delphi客戶端

      摘要: 最近在做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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章