程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c# socket通信較完善方案,

c# socket通信較完善方案,

編輯:C#入門知識

c# socket通信較完善方案,


c#的socket通信應用.文件較多.附件為工程.  core   AbstractBytesWorker.cs    字節工作器(基類),用於用於同一不同功能的字節工作器  BinaryHand.cs  2進制處理器.  ThDispose.cs 處理回收相關   crc  
entity   ThPersonInfo.cs   manager   ThSocketManager.cs  ThSocketManagerBusiness.cs 所有的業務   request  RequestCode.cs  請求碼  ThProtocolReq.cs 請求邏輯  ThReqBytesWorker.cs 請求相關的字節工作器   response   respLogic     ThProtocolResp.cs 處理服務器響應的數據.     ThProtocolRespDelegates.cs 所有的代理.用於通知客戶的事件.     ThProtocolRespEvents.cs 所有的事件.用於調用客戶的.    ThProtocolRespListeners.cs 所有的監聽器,用於控制事件如何訂閱     ThProtocolRespLogic.cs 處理服務器的數據    ThRespBytesWorker.cs 響應字節處理器   BinaryMessageHandler.cs 處理數據包粘結,包一次數據不足等情況.  ResponseCode.cs 響應碼   socket   TAsyncTcpClient.cs tcpClient類,read異步.   testcase  ===============================================================   部分類代碼:  BinaryMessageHandler  C#代碼  收藏代碼
  1. #pragma warning disable 0219  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Text;  
  6. using System.IO;  
  7.   
  8. /// <summary>  
  9. /// 字節接收處理,粘包問題  
  10. /// </summary>  
  11. class BinaryMessageHandler : ThDispose  
  12. {  
  13.     List<byte> bytesList = new List<byte>();  
  14.   
  15.     private TAsyncTcpClient tcpClient;  
  16.   
  17.     public BinaryMessageHandler(TAsyncTcpClient tcpClient)  
  18.     {  
  19.         this.tcpClient = tcpClient;  
  20.     }  
  21.     public BinaryMessageHandler()  
  22.     {  
  23.   
  24.     }  
  25.   
  26.     override public void SelfDispose()  
  27.     {  
  28.         tcpClient = null;  
  29.         bytesList = null;  
  30.     }  
  31.       
  32.     /// <summary>  
  33.     /// 累積 字節.  
  34.     /// 每次累積後,測試是否有完整的包.  
  35.     /// </summary>  
  36.     /// <param name="buf"></param>  
  37.     public void Write(byte[] buf)  
  38.     {  
  39.         if (buf.Length > 0)  
  40.         {  
  41.             //累積字節  
  42.             bytesList.AddRange(buf);  
  43.             byte[] bytes = bytesList.ToArray<byte>();  
  44.             MemoryStream ms = new MemoryStream(bytes);  
  45.             BinaryReader reader = new BinaryReader(ms);  
  46.   
  47.             int header = reader.ReadUInt16();  
  48.             if (header == ThSocketManager.TH_HEADER)  
  49.             {  
  50.                 int len = reader.ReadUInt16();  
  51.                 int remainLen = len - 4;  
  52.                 if ((ms.Length - ms.Position) >= remainLen)  
  53.                 {  
  54.                     //有完整的數據包  
  55.                     ms.Position = 0;  
  56.                     byte[] pack = reader.ReadBytes(len);  
  57.   
  58.                     ReadPackage(pack);  
  59.                     //移除讀完的數據包  
  60.                     bytesList.RemoveRange(0, len);  
  61.                 }  
  62.             }  
  63.             reader.Close();  
  64.             ms.Close();  
  65.         }  
  66.   
  67.     }  
  68.   
  69.     /// <summary>  
  70.     /// 讀取服務端響應信息.  
  71.     /// </summary>  
  72.     /// <param name="bytes"></param>  
  73.     /// <returns></returns>  
  74.     public void ReadPackage(byte[] bytes)  
  75.     {  
  76.         //處理包頭  
  77.         MemoryStream ms = new MemoryStream(bytes);  
  78.         ms.Position = 0;  
  79.         BinaryReader reader = new BinaryReader(ms, Encoding.UTF8);  
  80.         ushort header = reader.ReadUInt16();  
  81.         ushort totalLen = reader.ReadUInt16();  
  82.         ushort respCode = reader.ReadUInt16();  
  83.         short signature = reader.ReadInt16();  
  84.         int dataLen = totalLen - ThSocketManager.PREFIX_LENGTH;  
  85.         byte[] dataBytes = reader.ReadBytes(dataLen);  
  86.         reader.Close();  
  87.         ms.Close();  
  88.   
  89.         //調用服務端響應,包體處理器.  
  90.         tcpClient.thProtocolResp.ResponseHandler(respCode, dataBytes);  
  91.     }  
  92. }  
BinaryHand  C#代碼  收藏代碼
  1. #pragma warning disable 0219  
  2. using System.Text;  
  3. using System.IO;  
  4.   
  5. class BinaryHand  
  6. {  
  7.     /// <summary>  
  8.     /// 准備將數據發送至服務端  
  9.     /// </summary>  
  10.     /// <param name="clientId"></param>  
  11.     /// <param name="data"></param>  
  12.     /// <returns></returns>  
  13.     public static byte[] ToBytes(ushort requestCode, uint clientId, byte[] dataBytes)  
  14.     {  
  15.         MemoryStream ms = new MemoryStream();  
  16.         BinaryWriter writer = new BinaryWriter(ms);  
  17.         //2 ushort header  
  18.         writer.Write(ThSocketManager.TH_HEADER);  
  19.         //2 ushort total length  
  20.         ushort packageLen = ThSocketManager.PREFIX_LENGTH;  
  21.         if (dataBytes != null)  
  22.         {  
  23.             packageLen += (ushort)dataBytes.Length;  
  24.         }  
  25.         writer.Write(packageLen);  
  26.         //2 ushort protocol id  
  27.         writer.Write(requestCode);  
  28.         //2 short signature  
  29.         writer.Write((short)0);  
  30.         //4 unit client id  
  31.         //writer.Write(clientId);  
  32.         //x string data  
  33.         if (dataBytes != null)  
  34.             writer.Write(dataBytes);  
  35.         //計算crc,並寫入[6,7]位置.  
  36.         byte[] tmpBytes = ms.ToArray();  
  37.         short signature = CRC16.Compute(tmpBytes);  
  38.         long oldPos = ms.Position;  
  39.         ms.Position = 6;  
  40.         writer.Write(signature);  
  41.         ms.Position = oldPos;  
  42.         //准備輸出  
  43.         byte[] bytes = ms.ToArray();  
  44.   
  45.         writer.Close();  
  46.         ms.Close();  
  47.         return bytes;  
  48.     }  
  49.   
  50.     public static byte[] ToBytes(RequestCode requestCode, uint clientId, byte[] dataBytes)  
  51.     {  
  52.         return ToBytes((ushort)requestCode, clientId, dataBytes);  
  53.     }  
  54.   
  55.     public byte[] ToBytes(uint clientId, string data)  
  56.     {  
  57.         byte[] dataBytes = Encoding.UTF8.GetBytes(data);  
  58.         return ToBytes(RequestCode.None, clientId, dataBytes);  
  59.     }  
  60.   
  61.     /// <summary>  
  62.     /// 讀取服務端響應信息.  
  63.     /// </summary>  
  64.     /// <param name="bytes"></param>  
  65.     /// <returns></returns>  
  66.     public byte[] FromBytes(byte[] bytes)  
  67.     {  
  68.         MemoryStream ms = new MemoryStream(bytes);  
  69.         ms.Position = 0;  
  70.         BinaryReader reader = new BinaryReader(ms, Encoding.UTF8);  
  71.         ushort header = reader.ReadUInt16();  
  72.         ushort totalLen = reader.ReadUInt16();  
  73.         ushort protocolId = reader.ReadUInt16();  
  74.         short signature = reader.ReadInt16();  
  75.         uint clientId = reader.ReadUInt32();  
  76.         int dataLen = totalLen - ThSocketManager.PREFIX_LENGTH;  
  77.         byte[] dataBytes = reader.ReadBytes(dataLen);  
  78.   
  79.         reader.Close();  
  80.         ms.Close();  
  81.         return dataBytes;  
  82.     }  
  83. }  
  • cusCom.rar (124.7 KB)

C語言裡面,這個符號(->)是什,怎使用?

這是結構體指針中的一個符號,給你寫個程序解釋一下吧,例如:
#include<stdio.h>
struct STU //定義一個結構體
{
int num;
}stu;
int main()
{
struct STU *p; //定義一個結構體指針
p=stu; //p指向stu這個結構體變量
stu.num=100; //給結構體成員num附個初值
printf("%d",p->num); //輸出stu中的num的值
return;
}
看到了吧,->的作法就是在引用結構體中的變量!!
形式如:p->結構體成員(如p->num)
他的作用相當於stu.num或(*p).num
不知道這樣解釋你明不明白、、、、、不懂了call我,O(∩_∩)O~
望采納。
 

c語言中符號<<是什

左移運算符(<<)

將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。

例:a = a << 2 將a的二進制位左移2位,右補0,

左移1位後a = a * 2;

若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。
右移運算符(>>)

將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。

操作數每右移一位,相當於該數除以2。

例如:a = a >> 2 將a的二進制位右移2位,

左補0 or 補1 得看被移數是正還是負。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved