vb.net的ashx来作的WebSocketRequest 请求聊天代码

vb.net的ashx来作的WebSocketRequest 请求聊天代码,现在网上关于vb.net的代码越来越少了,而对于websocket的代码更少。

首页要定义一个公共用户组,然后将每一个请求的全部放到数组中挂起,用户有消息了再进行转发。

  Public ChatList As New Dictionary(Of String, Net.WebSockets.WebSocket) '当前在线的用户  
 

<%@ WebHandler Language="VB" Class="Chat" %>
Imports Newtonsoft.Json
Imports System.Text.Encoding '引用文本编码
Imports System.Threading
Imports System.Net.WebSockets
Public Class Chat : Implements IHttpHandler
  Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
    Get
      Return False
    End Get
  End Property
  Public Sub ProcessRequest(ByVal Context As HttpContext) Implements IHttpHandler.ProcessRequest
    If Context.IsWebSocketRequest = False Then Context.Response.Write("请求类型错误") : Context.Response.End()
    Context.AcceptWebSocketRequest(AddressOf SocketHandler) '接到一个请求
  End Sub

  Private Async Function SocketHandler(Context As WebSockets.AspNetWebSocketContext) As Tasks.Task
    Try
      Dim WS As WebSocket = Context.WebSocket, ID As String = GetRequest("ID", 8)
      If ChatList.ContainsKey(ID) = True Then '检查是否在线包含
        ChatList(ID) = WS
      Else '新会员
        ChatList.Add(ID, WS) '上线
      End If

      Dim Buffer As New ArraySegment(Of Byte)(New Byte(2048) {}), Result As WebSocketReceiveResult
      While True '一直扫描状态
        Select Case WS.State'连接状态
          Case WebSocketState.None, WebSocketState.Connecting '正在连接不处理
          Case WebSocketState.Open '已连接
            Result = Await WS.ReceiveAsync(Buffer, CancellationToken.None)
            If Result.EndOfMessage = True AndAlso Result.Count > 0 Then
              Message(ID, Buffer.Array, Result.Count)
            End If
          Case WebSocketState.CloseSent, WebSocketState.CloseReceived, WebSocketState.Closed, WebSocketState.Aborted '断开连接
            ChatList.Remove(ID)  '下线
            Exit While
        End Select
        Thread.Sleep(1000) '延迟1秒
      End While
    Catch ex As Exception
      SoftLog(ex.ToString, "Chat.txt") '记录系统错误
    End Try
  End Function
  '处理接受到的消息内容
  Sub Message(UserID As String, Buffer() As Byte, Count As Integer)
    Try
      Dim RStr As String = Encoding.UTF8.GetString(Buffer, 0, Count), Json As Object = JsonConvert.DeserializeObject(RStr)
      If Json("MsgType") = False Then Return



      If UserID <> "1" AndAlso ChatList.ContainsKey("1") = True Then
        RStr = "成功:" & ChatList.Count
        ChatList("1").SendAsync(New ArraySegment(Of Byte)(Encoding.UTF8.GetBytes(RStr)), WebSocketMessageType.Text, True, CancellationToken.None)





      ElseIf UserID <> "2" AndAlso ChatList.ContainsKey("2") = True Then
        RStr = "成功:" & ChatList.Count
        ChatList("2").SendAsync(New ArraySegment(Of Byte)(Encoding.UTF8.GetBytes(RStr)), WebSocketMessageType.Text, True, CancellationToken.None)
      ElseIf UserID <> "3" AndAlso ChatList.ContainsKey("3") = True Then
        RStr = "成功:" & ChatList.Count
        ChatList("3").SendAsync(New ArraySegment(Of Byte)(Encoding.UTF8.GetBytes(RStr)), WebSocketMessageType.Text, True, CancellationToken.None)

      Else

        RStr = "当前在线:" & ChatList.Count
        ChatList(UserID).SendAsync(New ArraySegment(Of Byte)(Encoding.UTF8.GetBytes(RStr)), WebSocketMessageType.Text, True, CancellationToken.None)

      End If    '在线会员




    Catch ex As Exception
      ChatList(UserID).Abort() '断开连接
      ChatList.Remove(UserID)  '用户下线
      SoftLog(ex.ToString) '记录系统错误
    End Try
  End Sub
End Class

这是我作的效果,包括文字、语音、视频、红包类聊天

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值