1. 程式人生 > >關於supersocker的數據傳輸中的問題

關於supersocker的數據傳輸中的問題

sock client bytes har receive arp 終端 rom inf

最近在學socket,在使用socket時數據的傳輸與接口都是byte,所以文本與文件的傳輸只要對傳過來的byte處理好就可以。

但是在supersocket上,我卻花費了很長的時間。原因如下:

1、從客戶端傳來的byte都會處理成string,

在開始接觸supersocket時發現對於文字的傳輸很方便,但是到了文件的傳輸時我才發現,傳過來的byte都會轉化為string,

這讓我很是煩惱,在經過排查才發現StringRequestInfo為string接口會將傳過來的byte轉化為string

那如果我不要轉化呢?經過網上學習發現要接收不同的接口,要自己而外的編寫轉化接口。

2.接口的傳輸與接收

接口的編寫網上資料可以各自查找,經過學識後我用基於FixedHeaderReceiveFilter的接口寫了一個byte的接口,

接口構造如下:

技術分享

根據構造代碼如下:(6=name(4)+len(2))

  public ByteReceiveFilter()
        : base(6)
       {

        }

        protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
        {
            return (int)header[offset + 4] * 256 + (int)header[offset + 5];
        }

        protected override BinaryRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
        {
            return new BinaryRequestInfo(Encoding.UTF8.GetString(header.Array, header.Offset, 4), bodyBuffer.CloneRange(offset, length));
        }

  

寫好接口後我發現,數據傳不進來,又一通查找發現客戶端也要按照構造來傳輸byte如下:

  byte[] buffer = Encoding.UTF8.GetBytes(msg);
            byte[] senddata = new byte[buffer.Length + 6];
            senddata[0] = 0;         
            senddata[1] = 0;
            senddata[2] = 0;
            senddata[3] = 0;
            senddata[4] = (byte)(buffer.Length / 256);
            senddata[5] = (byte)(buffer.Length % 256);
            Buffer.BlockCopy(buffer, 0, senddata, 6, buffer.Length);
            client.Send(byteing(buffer));

  0-3為傳名稱(可空),4-5為傳輸數據包的大少(必填),後面為數據包

3.在弄好接口發現當傳輸512以下的文件時沒錯,但是過了512後發現文件的傳輸會報錯

又經過一輪查找,因為終端每次發送文件的最大緩沖區是512字節,所以每次接收也是定義為512字節,所以超過512後要分開傳輸,然而還是沒有解決問題,

然後在逐步的調試中才發現,分成512每包後,但在發送時加上頭的6個字段就超過了512的字節,所以將包分成506的字節就解決了問題了。

關於supersocker的數據傳輸中的問題