關於supersocker的數據傳輸中的問題
阿新 • • 發佈:2017-09-15
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的數據傳輸中的問題