使用C#+Signalr可以比较轻松实现你的需求,代码量也很少,一个服务端,一个客户端,总代码量不到100行。
先看演示效果:

解决方案目录:

服务端示例代码:
MessageHub.cs
using Microsoft.AspNetCore.SignalR;
namespace ChatDemo.Server.Hubs
{
public class MessageHub : Hub
{
public Task SendMessage(string user, string message)
{
Console.WriteLine($"服务器接收到消息,内容:{user},{message}");
return Clients.All.SendAsync("ReceiveMessage", user, message);
}
/// <summary>
/// Called when a new connection is established with the hub.
/// </summary>
/// <returns>A <see cref="T:System.Threading.Tasks.Task" /> that represents the asynchronous connect.</returns>
public override Task OnConnectedAsync()
{
Console.WriteLine($"客户[{Context.ConnectionId}]连接成功.");
return base.OnConnectedAsync();
}
}
}
Program.cs
using ChatDemo.Server.Hubs;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR();
var app = builder.Build();
app.MapHub<MessageHub>("/hub/message");
app.Run();
客户端
using Microsoft.AspNetCore.SignalR.Client;
namespace ChatDemo.Client
{
public partial class FrmMain : Form
{
private HubConnection _connection;
public FrmMain()
{
InitializeComponent();
}
private async void btnSendMessage_Click(object sender, EventArgs e)
{
try
{
await _connection.InvokeAsync("SendMessage", txtUser.Text, txtNewMessage.Text);
}
catch (Exception ex)
{
AppendMessage(ex.Message);
}
}
private void FrmMain_Load(object sender, EventArgs e)
{
_connection = new HubConnectionBuilder()
.WithUrl("http://localhost:5025/hub/message")
.Build();
_connection.Closed += async (error) =>
{
await _connection.StartAsync();
};
_connection.On<string, string>("ReceiveMessage", (user, message) =>
{
Invoke(() =>
{
var newMessage = $"{user}: {message}";
AppendMessage(newMessage);
});
});
try
{
_connection.StartAsync();
AppendMessage("已成功连接到消息服务器");
txtNewMessage.Focus();
}
catch (Exception ex)
{
AppendMessage(ex.Message);
}
}
private void AppendMessage(string message)
{
rtxtMessages.AppendText($"[{DateTime.Now}]==>>{message}{Environment.NewLine}");
}
}
}