websocket

Framework服务端

public static async Task StartServerAsync(string url)
{
var httpListener = new HttpListener();
httpListener.Prefixes.Add(url);
httpListener.Start();
Console.WriteLine("Listening on " + url);

while (true)
{
var context = await httpListener.GetContextAsync();
if (context.Request.IsWebSocketRequest)
{
Console.WriteLine("WebSocket connection request received.");
var webSocketContext = await context.AcceptWebSocketAsync(subProtocol: null);
await HandleWebSocketConnection(webSocketContext);
}
else
{
context.Response.StatusCode = 400;
string responseText = "<html><body>We only support WebSocket requests.</body></html>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseText);
context.Response.ContentLength64 = buffer.Length;
await context.Response.OutputStream.WriteAsync(buffer, 0, buffer.Length);
context.Response.Close();
}
}
}

private static async Task HandleWebSocketConnection(HttpListenerWebSocketContext webSocketContext)
{
var webSocket = webSocketContext.WebSocket;
byte[] buffer = new byte[1024];
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
{
Console.WriteLine("Received: " + System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count));
string param = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
var arra = param.Split(',');
if (arra.Length == 9)
{
if (arra[0] == "GetRecipeIndexTable_ByPM")
{
DataTable tab = GetRecipeIndexTable(arra[1], arra[2], arra[3]);
string jsonData = SerializeDataTable(tab);
byte[] abuffer = Encoding.UTF8.GetBytes(jsonData);
await webSocket.SendAsync(new ArraySegment<byte>(abuffer), WebSocketMessageType.Text, true, CancellationToken.None); // Echo back the message
}
if (arra[0] == "GetRecipeList_ByCondition")
{
DataTable tab = GetRecipeList_ByCondition(arra[1], arra[2], arra[3]);
string jsonData = SerializeDataTable(tab);
byte[] abuffer = Encoding.UTF8.GetBytes(jsonData);
await webSocket.SendAsync(new ArraySegment<byte>(abuffer), WebSocketMessageType.Text, true, CancellationToken.None); // Echo back the message
}
}
else
{
var abuffer = Encoding.UTF8.GetBytes(arra.Length.ToString());
}
}
else if (result.MessageType == WebSocketMessageType.Close)
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
break;
}
}
}

-------------------------------------------

WebApi客户端

public static async Task<DataTable> SocketClientHub(string type,string param1,string param2,string param3,string param4,string param5,string param6,string parma7,string parma8)
{
// WebSocket服务器地址
string url = "ws://localhost:8002/"; // 确保这是你的WebSocket服务器的地址和端口
DataTable data = new DataTable();
using (var client = new ClientWebSocket())
{
try
{
// 连接到WebSocket服务器
await client.ConnectAsync(new Uri(url), CancellationToken.None);
Console.WriteLine("Connected to the WebSocket server.");

// 发送消息到服务器
string message = type + "," + param1 + "," + param2 + "," + param3 + "," + param4 + "," + param5 + "," + param6 + "," + parma7 + "," + parma8;
var buffer = Encoding.UTF8.GetBytes(message);
await client.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
Console.WriteLine("Message sent.");

// 接收消息从服务器
var receiveBuffer = new byte[1024 * 4]; // 创建一个缓冲区来接收数据
var messagebuilder = new StringBuilder();
WebSocketReceiveResult result;
do
{
result = await client.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
string receivedMessage = Encoding.UTF8.GetString(receiveBuffer, 0, result.Count);
messagebuilder.Append(receivedMessage);
} while (!result.EndOfMessage);
string jsonData = messagebuilder.ToString();
data = JsonConvert.DeserializeObject<DataTable>(jsonData);
}
catch (Exception e)
{
Console.WriteLine($"An error occurred: {e.Message}");
}
finally
{
// 关闭WebSocket连接
await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing handshake complete", CancellationToken.None);
Console.WriteLine("WebSocket connection closed.");
}
return data;
}
}

----------------------------------------

WebApi服务端

[HttpGet("ws")]
public async Task Get()
{
if (HttpContext.WebSockets.IsWebSocketRequest)
{
using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
string tim = DateTime.Now.ToString();
await HandleWebSocketConnection(webSocket, tim);
}
else
{
HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
}
}

private async Task HandleWebSocketConnection(WebSocket webSocket,string data)
{
var buffer = new byte[1024 * 4];
while (webSocket.State == WebSocketState.Open)
{
string tim = DateTime.Now.ToString();
var responseMessage = $"Server received: {tim}";
var responseBuffer = Encoding.UTF8.GetBytes(responseMessage);
await webSocket.SendAsync(new ArraySegment<byte>(responseBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
await Task.Delay(1000);
//var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

}
}

posted @ 2025-03-09 15:00  以至千里  阅读(23)  评论(0)    收藏  举报