.net websocket demo
时间: 2024-04-18 18:20:58 浏览: 186
.NET WebSocket是一种在Web应用程序中实现双向通信的技术。它允许服务器和客户端之间进行实时的数据传输,而无需进行轮询或刷新页面。下面是一个简单的.NET WebSocket示例:
1. 创建WebSocket服务器:
```csharp
using System;
using System.Net;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
public class WebSocketServer
{
private HttpListener _listener;
private CancellationTokenSource _cancellationTokenSource;
public async Task Start(string url)
{
_listener = new HttpListener();
_listener.Prefixes.Add(url);
_listener.Start();
_cancellationTokenSource = new CancellationTokenSource();
while (!_cancellationTokenSource.Token.IsCancellationRequested)
{
HttpListenerContext context = await _listener.GetContextAsync();
if (context.Request.IsWebSocketRequest)
{
ProcessWebSocketRequest(context);
}
else
{
context.Response.StatusCode = 400;
context.Response.Close();
}
}
}
private async void ProcessWebSocketRequest(HttpListenerContext context)
{
HttpListenerWebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null);
WebSocket webSocket = webSocketContext.WebSocket;
byte[] buffer = new byte[1024];
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
{
string message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"Received message: {message}");
// 处理接收到的消息
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
}
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}
public void Stop()
{
_cancellationTokenSource.Cancel();
_listener.Stop();
_listener.Close();
}
}
```
2. 创建WebSocket客户端:
```csharp
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
public class WebSocketClient
{
private ClientWebSocket _webSocket;
public async Task Connect(string url)
{
_webSocket = new ClientWebSocket();
await _webSocket.ConnectAsync(new Uri(url), CancellationToken.None);
await Task.WhenAll(ReceiveLoop(), SendLoop());
}
private async Task ReceiveLoop()
{
byte[] buffer = new byte[1024];
while (_webSocket.State == WebSocketState.Open)
{
WebSocketReceiveResult result = await _webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"Received message: {message}");
}
}
private async Task SendLoop()
{
while (_webSocket.State == WebSocketState.Open)
{
string message = Console.ReadLine();
byte[] buffer = Encoding.UTF8.GetBytes(message);
await _webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
}
}
public async Task Disconnect()
{
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Disconnect", CancellationToken.None);
_webSocket.Dispose();
}
}
```
3. 使用WebSocket服务器和客户端:
```csharp
using System;
using System.Threading.Tasks;
public class Program
{
public static async Task Main(string[] args)
{
string serverUrl = "http://localhost:8080/";
string clientUrl = "ws://localhost:8080/";
WebSocketServer server = new WebSocketServer();
WebSocketClient client = new WebSocketClient();
Task serverTask = server.Start(serverUrl);
Task clientTask = client.Connect(clientUrl);
await Task.WhenAll(serverTask, clientTask);
server.Stop();
}
}
```
这是一个简单的.NET WebSocket示例,它创建了一个WebSocket服务器和一个WebSocket客户端,并实现了基本的消息收发功能。你可以根据自己的需求进行扩展和修改。
阅读全文
相关推荐

















