跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • c#的 socket 这样写对不对啊
未分類
2 12 月 2020

c#的 socket 这样写对不对啊

c#的 socket 这样写对不对啊

資深大佬 : zxCoder 4

异步,长连接,不知道这样子写对不对,在官网例子的基础上改了一点

大概代码是这样子的,主要改的就是注释的地方

namespace MongoDB_PBAC_Server {     public class StateObject {         public const int BufferSize = 2048;         public byte[] buffer = new byte[BufferSize];         public int length;         public Socket workSocket = null;     }      public class Server {         public static ManualResetEvent allDone = new ManualResetEvent(false);         public static void StartListening() {             IPAddress ipAddress = IPAddress.Parse("127.0.0.1");             int port = 33660;             IPEndPoint point = new IPEndPoint(ipAddress, port);             Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);             try {                 listener.Bind(point);                 listener.Listen(100);                 while (true) {                     allDone.Reset();                     listener.BeginAccept(AcceptCallback, listener);                     allDone.WaitOne();                 }             }             catch (Exception e) {  }         }          public static void AcceptCallback(IAsyncResult ar) {             allDone.Set();             Socket listener = (Socket) ar.AsyncState;             Socket handler = listener.EndAccept(ar);             StateObject state = new StateObject();             state.workSocket = handler;             handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, ReadCallback, state);         }          public static void ReadCallback(IAsyncResult ar) {             StateObject state = (StateObject) ar.AsyncState;             Socket handler = state.workSocket;             int bytesRead = handler.EndReceive(ar);             state.length += bytesRead;             if (bytesRead > 0) {                 // 将缓冲区的字节反序列化为消息对象                 Message message = Message.FromBytes(state.buffer);                 if (message != null) {                     byte[] temp = new byte[StateObject.BufferSize];                     // 头部占 5 个字节                     for (int i = 0; i < state.length-(message.length+5); i++) {                         temp[i] = state.buffer[message.length+5 + i];                     }                     state.buffer = temp;                     state.length -= (message.length+5);                     Message res = HandleMessage(message);                     Send(handler, res.ToBytes());                 }                  // 剩下的继续接收                                 handler.BeginReceive(                     state.buffer,                     state .length,                     state.buffer.Length - state.length,                     0,                     ReadCallback,                     state);             }             else {                 // 如果接收字节数为 0,就关闭客户端?                 handler.Shutdown(SocketShutdown.Both);                 handler.Close();             }         }          private static void Send(Socket handler, byte[] data) {             handler.BeginSend(data, 0, data.Length, 0, SendCallback, handler);         }          private static void SendCallback(IAsyncResult ar) {             try {                 Socket handler = (Socket) ar.AsyncState;                 int bytesSent = handler.EndSend(ar);             }catch (Exception e) {}         }          private static Message HandleMessage(Message message) {             return message;         }     } } 

大佬有話說 (3)

  • 資深大佬 : actorzjp

    发到.NET 节点啊

  • 資深大佬 : opengps

    头部占 5 个细节是协议约定的?你应该识别验证是否头部,不应该跳过

  • 主 資深大佬 : zxCoder

    @opengps

    “`
    // 将缓冲区的字节反序列化为消息对象
    Message message = Message.FromBytes(state.buffer);
    if (message != null) {}
    “`

    这里 FromBytes 这个方法是将字节流转化为消息对象,后面那不是跳过,而是把这部分已经转化为消息的字节流去掉,让剩下的字节移到 state.buffer 的前面来

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具