using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Text; namespace Azylee.YeahWeb.SocketUtils.TcpUtils { /// /// Tcp 流数据处理辅助类 /// public class TcpStreamHelper { const int ReceiveBufferSize = 1024; /// /// 流 写入 /// /// /// /// public static bool Write(TcpClient client, TcpDataModel model) { try { if (client != null && client.GetStream() != null) { byte[] md_byte = model.ToByte(); byte[] length_byte = BitConverter.GetBytes((int)(md_byte.Length + 4)); List data = new List(); data.AddRange(length_byte);//长度 data.AddRange(new byte[] { 111, 222, 66, 66 });//标志 data.AddRange(md_byte);//内容 client.GetStream().Write(data.ToArray(), 0, data.Count);//写出内容 return true; } } catch { } return false; } /// /// 流 读取 /// /// /// public static TcpDataModel Read(TcpClient client) { TcpDataModel data = null; try { if (client != null && client.GetStream() != null) { //内容长度 byte[] data_length = new byte[4]; int read = client.GetStream().Read(data_length, 0, 4); int length = BitConverter.ToInt32(data_length, 0) - 4; if (read > 0 && length > 0) { //内容头部标志 byte[] data_head = new byte[4]; client.GetStream().Read(data_head, 0, 4); bool head = data_head[0] == 111 && data_head[1] == 222 && data_head[2] == 66 && data_head[3] == 66; if (head) { //读取内容 byte[] buffer = new byte[length]; int bf_read = 0; while (bf_read < length) { //循环读取内容,防止断包 bf_read += client.GetStream().Read(buffer, bf_read, length - bf_read); if (bf_read < length) { int x = bf_read; } } //解析内容 data = TcpDataModel.ToModel(buffer); } } else { if (read == 0) client?.Close(); } } } catch { } return data; } } }