一、TCPClinet知识点
1、创建TCPClient客户端发送消息示例:
/// <summary>
/// 发送消息-未做粘包和拆包处理
/// </summary>
/// <param name="msg">数据流</param>
/// <returns></returns>
public ResultData_TCP SendMsg_Nohandle(string msg)
{
ResultData_TCP resultData_TCP = new ResultData_TCP();
try
{
// TcpClient _tcpClient = new TcpClient(hostname, port); // 先开启连接
byte[] data = System.Text.Encoding.ASCII.GetBytes(msg);
NetworkStream stream = _tcpClient.GetStream(); // 获取当前数据流
stream.Write(data, 0, data.Length); // 写入
stream.Flush();
stream.Close(); // 关闭流
resultData_TCP = new ResultData_TCP()
{
ResultCode = 1,
ResultMsg = "发送成功!"
};
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
resultData_TCP = new ResultData_TCP()
{
ResultCode = -1,
ResultMsg = string.Concat("参数无效;错误内容: ", e.HResult, ",", e.Message)
};
} // 参数无效(当将 null 引用传递到不接受其作为有效参数的方法时引发的异常。)
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
resultData_TCP = new ResultData_TCP()
{
ResultCode = -1,
ResultMsg = string.Concat("网络异常,套接字错误;错误内容: ", e.HResult, ",", e.Message)
};
} // 套接字错误(发生套接字错误时引发的异常。)
catch (Exception ex)
{
resultData_TCP = new ResultData_TCP()
{
ResultCode = -1,
ResultMsg = string.Concat("发生错误;错误内容: ", ex.HResult, ",", ex.Message),
};
} // 其他错误信息
return resultData_TCP;
}
2、创建TcpListener监听TCPClient(线程-Net Framework):
try
{
if (btnOpenCloseThread.Text == "开启监听-控制线程") // 开启监听
{
// 检查地址
if (!CheckServerUrl())
{
return;
}
IPHostEntry ipInfo = Dns.Resolve("127.0.0.1"); // 主机信息
IPAddress[] ipList = ipInfo.AddressList; // IP数组
IPAddress localAddr = ipList[0]; // IP
int port = int.Parse(txtPort.Text);
_listenter = _TCPHelper.TcpListener_Start(localAddr, port);
_listenter.Start(); // 开始监听
thListener = new Thread(new ThreadStart(Run)); //定义线程进行监听
thListener.IsBackground = true;
thListener.Start(); //线程启动
btnOpenCloseThread.Text = "关闭监听-控制线程";
btnOpenCloseThread.BackColor = Color.FromArgb(128, 255, 128);
}
else // 关闭监听
{
if (thListener != null)
{
//thListener.Interrupt();
_listenter.Stop();
}
btnOpenCloseThread.Text = "开启监听-控制线程";
btnOpenCloseThread.BackColor = Color.FromArgb(255, 128, 128);
}
}
catch (Exception ex)
{
btnOpenCloseThread.Text = "开启监听-控制线程";
btnOpenCloseThread.BackColor = Color.FromArgb(255, 128, 128);
ShowLog($"开启/关闭监听失败,错误信息: {ex.Message}");
}
3、创建TcpListener监听TCPClient(线程池-Net 5):
4、创建TcpListener监听TCPClient(线程委托,线程外修改循环线程中的变量-Net 5):
二、处理TCP粘包与拆包
1、固定消息长度 + 缓存
2、消息前后加特殊字符标记边界 + 缓存
string dd=$"{边界标识}{数据流}{边界标识}";
3、定义消息结构体,结构体中定义一个字段存储信息长度 + 缓存
string dd="Header{开始标记+一个内容的长度}+Body{数据流}";