`using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace SocketComm
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
List clientList = new List();
#region Socket tcp 服务端
//{
// Socket socket = new Socket(
// AddressFamily.InterNetwork,
// SocketType.Stream,
// ProtocolType.Tcp
// );
// socket.Bind(new IPEndPoint(IPAddress.Any, 9000));
// socket.Listen(1);
// Task.Run(() =>
// {
// while (true)
// { Socket client = socket.Accept();
// clientList.Add(client);
// Task.Run(() =>
// {
// while (true)
// {
// byte[] buffer = new byte[1024];
// client.Receive(buffer);
// string msg = Encoding.UTF8.GetString(buffer);
// Console.WriteLine("从客户端收到:" + msg);
// msg += "-服务端发送";
// client.Send(Encoding.UTF8.GetBytes(msg));
// }
// });
// }
// });
// //var state = socket.BeginAccept(new AsyncCallback(result =>
// //{
// // Console.WriteLine(result.IsCompleted);
// //}
// //), null);
// //state.AsyncWaitHandle.WaitOne();
// Console.WriteLine("服务监听已启动...");
//}
#endregion
#region Socket Tcp 客户端
//{
// using (Socket socket = new Socket(
// AddressFamily.InterNetwork,
// SocketType.Stream,
// ProtocolType.Tcp))
// {
// socket.ReceiveTimeout = 5000;
// socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9001));
// byte[] bytes = Encoding.UTF8.GetBytes("Request");
// socket.Send(bytes);
// byte[] buffer = new byte[1024];
// try
// { socket.Receive(buffer);
// string msg = Encoding.UTF8.GetString(buffer).Replace("\0", "");
// Console.WriteLine(Encoding.UTF8.GetString(buffer));
// }
// catch (Exception ex)
// {
// Console.WriteLine("接收超时");
// Console.WriteLine(ex.Message);
// }
// }
//}
#endregion
#region Socket 断线重连
{
Socket socket = new Socket(
AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9000));
Console.WriteLine(socket.Connected);
while (true)
{
Thread.Sleep(1000);
bool state = !(!socket.Connected ||
(socket.Poll(1, SelectMode.SelectRead)
&& socket.Poll(1, SelectMode.SelectWrite)
&& (socket.Available == 0)));
if (state)
{
Console.WriteLine("连接正常");
//socket.Shutdown(SocketShutdown.Both);
//socket.Dispose();
}
else
{
Console.WriteLine("连接断开");
socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
var result = socket.BeginConnect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9000), null, null);
bool s = result.AsyncWaitHandle.WaitOne(1000);
if (s)
{
Console.WriteLine("重新连接");
}
else
{
try
{
socket.EndConnect(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("重新连接失败");
}
//var result = socket.BeginConnect(new IPEndPoint(IPAddress.Parse("192.168.2.1"), 102),
// new AsyncCallback(r =>
// {
// Console.WriteLine(r.AsyncState);
// if (!r.IsCompleted)
// socket.EndConnect(r);
// Console.WriteLine("回调执行");
// }), null);
//bool s = result.AsyncWaitHandle.WaitOne(1000);
//if (s)
//{
// Console.WriteLine("重新连接");
//}
//else
//{
// try
// {
// } catch (Exception ex) {
// Console.WriteLine(ex.Message);
// }
Console.WriteLine("重连失败");
}
}
#endregion
Console.WriteLine("重连失败");
}
}
} }
`

csharp
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace SocketComm
{
internal class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Hello, World!");
List<Socket> clientList = new List<Socket>();
#region
Socket client;
Task.Run(async()=>
{
try
{
int index = 0;
while (true)
{
index++;
await Task.Delay(1000);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var result = client.BeginConnect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666), null, null
);
bool state = result.AsyncWaitHandle.WaitOne(1000);
if (client.Connected)
{
client.EndConnect(result);
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")}-{DateTime.Now.Microsecond.ToString("000")} " +
$"[{index.ToString("000")}] 链接成功");
}
else
{
Console.WriteLine($"{DateTime.Now.ToString("HH-mm-ss")}-{DateTime.Now.Millisecond.ToString("000")}" +
$"[{index.ToString("000")}] 链接失败");
}
client.Dispose();
}
} catch (Exception ex) {
Console.WriteLine(ex.Message);
}
});
}
#endregion
}
}


csharp
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace SocketComm
{
internal class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Hello, World!");
List<Socket> clientList = new List<Socket>();
#region
// Socket client;
// Task.Run(async()=>
// {
// try
// {
// int index = 0;
// while (true)
// {
// index++;
// await Task.Delay(1000);
// client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// var result = client.BeginConnect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666), null, null
// );
// bool state = result.AsyncWaitHandle.WaitOne(1000);
// if (client.Connected)
// {
// client.EndConnect(result);
// Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")}-{DateTime.Now.Microsecond.ToString("000")} " +
// $"[{index.ToString("000")}] 链接成功");
// }
// else
// {
// Console.WriteLine($"{DateTime.Now.ToString("HH-mm-ss")}-{DateTime.Now.Millisecond.ToString("000")}" +
// $"[{index.ToString("000")}] 链接失败");
// }
// client.Dispose();
// }
// } catch (Exception ex) {
// Console.WriteLine(ex.Message);
// }
// });
//}
#endregion
Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666));
{
string msg = "hello";
byte[] data=Encoding.UTF8.GetBytes(msg);
socket.Send(data, 0, data.Length, SocketFlags.None);
byte[] buffer = new byte[1024 * 1024];
Console.WriteLine("开始接收");
socket.Receive(buffer);
Console.WriteLine("接收完成");
}
}
}
}

csharp
select a.course_name,a.course_id,
b.is_growing,b.growing_rate,
c.platform_name
from courses a
left join play_record b
on a.course_id=b.course_id
left join platforms c
on b.platform_id=c.platform_id
order by a.course_id,c.platform_id





csharp
this.DataContext = new FirstPageViewModel();





这么做的根本原因是数据库的存储格式和界面展示的需求不匹配。
数据库返回的是"扁平"表格,每行是一个课程在一个平台的数据。
但界面展示需要"分层"结构,每个课程一个卡片,里面包含它在所有平台的汇总图表和列表。
所以这个循环的作用就是进行数据转换,把数据库的"行数据"重新组织成界面的"课程对象",让数据能正确地显示在饼图和数据列表里。
通信协议


好的,我来为你详细解释 AutoResetEvent的作用以及这段异步代码的执行逻辑。
AutoResetEvent 是什么?
简单比喻:十字路口的红绿灯
想象一个十字路口:
new AutoResetEvent(false):红灯亮起,所有车辆(线程)都要停车等待
WaitOne():停车等待绿灯(如果当前是红灯就阻塞,如果是绿灯就直接通过,通过后自动变回红灯)
Set():把红灯变成绿灯,让一辆等待的车通过
关键特性:"自动重置" - 当一辆车通过后(一个线程被释放),信号灯会自动变回红灯,所以一次只能通过一辆车。
通
一句话解释,什么是SOCKET tcp客户端
Socket TCP客户端就像是打电话时的拨号方,主动连接到服务器的指定地址和端口,通过建立好的稳定"电话线"(TCP连接)来可靠地发送请求和接收响应。
一句话解释:什么是异步读写,什么是同步处理
一句话解释:同步处理就像排队打电话,必须等对方接听说完才能挂断;异步读写就像发微信,发送后可以去干别的,收到回复再处理。
一句话解释:代码干嘛
这段代码是在演示TCP客户端与服务器通信的两种方式:先同步发送"Hello"并阻塞等待回复,然后准备(但未执行)异步发送接收的代码框架。
简单说就是:连接服务器 → 同步发消息 → 等回复 → 准备异步框架(但没运行)
一句话解释:异步发送数据
异步发送数据就像寄信时不守在邮筒旁等回信,而是投递后继续做其他事,等邮差把回信送到家里再处理。
一句话解释:同步处理就像排队打电话,必须等对方接听说完才能挂断;异步读写就像发微信,发送后可以去干别的,收到回复再处理。
一句话解释:粘包、分包
粘包就是多个数据包粘在一起被一次收到,分包就是一个数据包被拆成多次收到。
这段被注释的代码演示了如何通过自定义协议头(序号1字节+协议名"zx"2字节+数据长度2字节)来解决TCP粘包分包问题,客户端按此格式打包发送10条"Hello"消息,服务器端按此格式解析接收的数据。