C# WebApi+Webrtc局域网音视频通话实例

这篇文章主要为大家详细介绍了C# WebApi+Webrtc局域网音视频通话实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C# WebApi+Webrtc 局域网音视频通话示例,供大家参考,具体内容如下

本示例通过IIS部署webapi,利用websocket进行webrtc消息交换,通过Chrome浏览器访问,可实现局域网内webrtc 音视频通话。

通过Chrome浏览器打开localhost/live.html本地网址,打开两个本地网,点击任意页面连接按钮即联通。

本示例未实现NAT穿透处理,互联网无法联通,如需NAT穿透请自行查阅相关资料。

关于webrtc、webapi相关技术说明请自行查阅相关资料,本文不做赘述说明。

运行效果如下图:

webapi端Handler1.ashx代码如下:

 using System; using System.Collections.Generic; using System.Linq; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web; using System.Web.WebSockets; namespace webrtclan { ///  /// 离线消息 ///  public class MessageInfo { public MessageInfo(DateTime _MsgTime, ArraySegment _MsgContent) { MsgTime = _MsgTime; MsgContent = _MsgContent; } public DateTime MsgTime { get; set; } public ArraySegment MsgContent { get; set; } } ///  /// Handler1 的摘要说明 ///  public class Handler1 : IHttpHandler { private static Dictionary CONNECT_POOL = new Dictionary();//用户连接池 private static Dictionary> MESSAGE_POOL = new Dictionary>();//离线消息池 public void ProcessRequest(HttpContext context) { if (context.IsWebSocketRequest) { context.Response.ContentType = "application/json"; context.Response.Charset = "utf-8"; context.AcceptWebSocketRequest(ProcessMsg); } } private async Task ProcessMsg(AspNetWebSocketContext context) { WebSocket socket = context.WebSocket; string user = context.QueryString["user"].ToString(); try { #region 用户添加连接池 //第一次open时,添加到连接池中 if (!CONNECT_POOL.ContainsKey(user)) { CONNECT_POOL.Add(user, socket);//不存在,添加 } else { if (socket != CONNECT_POOL[user])//当前对象不一致,更新 { CONNECT_POOL[user] = socket; } } #endregion //#region 连线成功 //for (int cp = 0; cp  joinedmsgbuffer = new ArraySegment(Encoding.UTF8.GetBytes(joinedmsg)); //        WebSocket destSocket = CONNECT_POOL.ElementAt(cp).Value;//目的客户端 //        await destSocket.SendAsync(joinedmsgbuffer, WebSocketMessageType.Text, true, CancellationToken.None); //    } //} //#endregion #region 离线消息处理 if (MESSAGE_POOL.ContainsKey(user)) { List msgs = MESSAGE_POOL[user]; foreach (MessageInfo item in msgs) { await socket.SendAsync(item.MsgContent, WebSocketMessageType.Text, true, CancellationToken.None); } MESSAGE_POOL.Remove(user);//移除离线消息 } #endregion while (true) { if (socket.State == WebSocketState.Open) { ArraySegment wholemessage= new ArraySegment(new byte[10240]); int i = 0; WebSocketReceiveResult dresult; do { //因为websocket每一次发送的数据会被tcp分包 //所以必须判断接收到的消息是否完整 //不完整就要继续接收并拼接数据包 ArraySegment buffer = new ArraySegment(new byte[2048]); dresult = await socket.ReceiveAsync(buffer, CancellationToken.None); string message1 = Encoding.UTF8.GetString(buffer.Array); buffer.Array.CopyTo(wholemessage.Array,i); i += 2048; } while (false == dresult.EndOfMessage); //string message = Encoding.UTF8.GetString(wholemessage.Array); //message = message.Replace("\0", "").Trim(); //JavaScriptSerializer serializer = new JavaScriptSerializer(); //Dictionary json = (Dictionary)serializer.DeserializeObject(message); //string target = (string)json.ElementAt(1).Value; #region 消息处理(字符截取、消息转发) try { #region 关闭Socket处理,删除连接池 if (socket.State != WebSocketState.Open)//连接关闭 { if (CONNECT_POOL.ContainsKey(user)) CONNECT_POOL.Remove(user);//删除连接池 break; } #endregion for (int cp = 0; cp  //      { //          if (!MESSAGE_POOL.ContainsKey(descUser))//将用户添加至离线消息池中 //            MESSAGE_POOL.Add(descUser, new List()); //          MESSAGE_POOL[descUser].Add(new MessageInfo(DateTime.Now, buffer));//添加离线消息 //    }); //} } catch (Exception exs) { //消息转发异常处理,本次消息忽略 继续监听接下来的消息 } #endregion } else { if (CONNECT_POOL.ContainsKey(user)) CONNECT_POOL.Remove(user);//删除连接池 break; } }//while end } catch (Exception ex) { //整体异常处理 if (CONNECT_POOL.ContainsKey(user)) CONNECT_POOL.Remove(user); } } public bool IsReusable { get { return false; } } } }
<

以上就是C# WebApi+Webrtc局域网音视频通话实例的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程