package com.acgist.manyrtc;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/manyrtcwebsoketdemo.video/{uid}")
public class WebSoketRTCTest {
// 最大通话数量
private static final int MAX_COUNT = 20;
private static final long MAX_TIME_OUT = 2 * 60 * 1000;
// 用户和用户的对话映射
private static final Map<String, String> user_user = Collections.synchronizedMap(new HashMap<String, String>());
// 用户和websocket的session映射
private static final Map<String, Session> sessions = Collections.synchronizedMap(new HashMap<String, Session>());
/**
* 打开websocket
* @param session websocket的session
* @param uid 打开用户的UID
*/
@OnOpen
public void onOpen(Session session, @PathParam("uid")String uid) {
session.setMaxIdleTimeout(MAX_TIME_OUT);
System.out.println("onOpen======uid===============" + uid);
sessions.put(uid, session);
user_user.put(uid, "true");
}
/**
* websocket关闭
* @param session 关闭的session
* @param uid 关闭的用户标识
*/
@OnClose
public void onClose(Session session, @PathParam("uid")String uid) {
remove(session, uid);
}
/**
* 收到消息
* @param message 消息内容
* @param session 发送消息的session
* @param uid
*/
@OnMessage
public void onMessage(String message, Session session, @PathParam("uid")String uid) {
try {
System.out.println("onMessage=====uid===============" + uid);
System.out.println("原始的message消息是:" + message);
String reviciver = message.substring(message.indexOf("}")+ 1);
message = message.substring(0, message.indexOf("}")+1);
if(message.indexOf("{") != -1) {
message = message.replace("{", "{\"userid\":\""+ uid +"\",");//只会替换第一个大括号,吧自己的id发送给对方
}
Session osession = sessions.get(reviciver);
System.out.println("osession.isOpen():==========" + osession.isOpen());
System.out.println("修改后的数据: 我是"+uid +"==========发送消息给" + reviciver + "=====消息内容是" + message);
if(osession.isOpen()){
osession.getAsyncRemote().sendText(new String(message.getBytes("utf-8")));
}else{
System.out.println(" 我是"+uid +"==========发送消息给" + reviciver + "=====但是" + reviciver + " 不在!");
this.nowaiting(osession);
}
/*for (Map.Entry<String, String> entry : user_user.entrySet()) {
System.out.println("key = " + entry.getKey() + " and value = " + entry.getValue());
othersid = entry.getKey();
//有别人,并且别人不等于自己(要排除掉自己给自己发送消息),
if(othersid != null && !uid.equals(othersid) && WebSoketRTCTest.sessions.get(othersid) != null) {
System.out.println("修改后的数据: 我是"+uid +"==========发送消息给" + othersid + "=====消息内容是" + message);
Session osession = sessions.get(othersid); // 被呼叫的session
System.out.println("osession.isOpen():==========" + osession.isOpen());
if(osession.isOpen()){
osession.getAsyncRemote().sendText(new String(message.getBytes("utf-8")));
}else{
System.out.println(" 我是"+uid +"==========发送消息给" + othersid + "=====但是" + othersid + " 不在!");
this.nowaiting(osession);
}
}
} */
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 没有人在等待
* @param session 发送消息的session
*/
private void nowaiting(Session session) {
session.getAsyncRemote().sendText("{\"type\" : \"nowaiting\"}");
}
/**
* 是否可以继续创建通话房间
* @return 可以:true;不可以false;
*/
public static boolean canCreate() {
return sessions.size() <= MAX_COUNT;
}
/**
* 判断是否可以加入
* @param oid 被申请对话的ID
* @return 如果能加入返回:true;否则返回false;
*/
public static boolean canJoin(String oid) {
return !(oid != null && user_user.containsKey(oid) && user_user.get(oid) != null);
}
/**
* 添加视频对象
* @param uid 申请对话的ID
* @param oid 被申请对话的ID
* @return 是否是创建者:如果没有申请对话ID为创建者,否则为为加入者。创建者返回:true;加入者返回:false;
*/
public static boolean addUser(String user) {
WebSoketRTCTest.user_user.put(user, "true");
return true;
}
/**
* 移除聊天用户
* @param session 移除的session
* @param uid 移除的UID
*/
private static void remove(Session session, String uid) {
System.out.println("我进来移除了其他的id ,并且关闭了session====uid ==" + uid);
/*String oid = user_user.get(uid);
if(oid != null) user_user.put(oid, null); // 设置对方无人聊天
sessions.remove(uid); // 异常session
user_user.remove(uid); // 移除自己
try {
if(session != null && session.isOpen()) session.close(); // 关闭session
} catch (IOException e) {
e.printStackTrace();
}*/
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
WEBRTC多人视频通话
共60个文件
java:17个
class:17个
jsp:12个
4星 · 超过85%的资源 需积分: 49 302 下载量 127 浏览量
2016-08-10
17:28:59
上传
评论 11
收藏 132KB ZIP 举报
温馨提示
WEBRTC多人视频通话,可以支持多人视频通话,目前是三人的,因为视频通话的信令用到的是websocket,所以代码里面也放入了单独websocket通信的demo,解释也比较详细了,原来有一个列子是两人的,后面改成三人的,多人的按照原理也是没问题,原创代码,转载注明出处
资源推荐
资源详情
资源评论
收起资源包目录
WebRTC多人视频.zip (60个子文件)
WebRTC
.settings
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.wst.common.project.facet.core.xml 252B
org.eclipse.core.resources.prefs 92B
org.eclipse.wst.common.component 456B
org.eclipse.wst.jsdt.ui.superType.container 49B
.jsdtscope 500B
org.eclipse.jdt.core.prefs 364B
src
com
acgist
rtc
ClientAServlet.java 690B
ClientBServlet.java 690B
WebSoketRTCTest.java 4KB
ClientCServlet.java 690B
manyrtc
ClientAServlet.java 698B
ClientBServlet.java 698B
WebSoketRTCTest.java 5KB
ClientCServlet.java 698B
websoket
ClientAServlet.java 729B
ClientBServlet.java 729B
WebSoketTest.java 4KB
ClientCServlet.java 729B
demo
AcgistVideo.java 4KB
AcgistVideoCopy.java 4KB
Msg.java 1KB
Client.java 2KB
Msg1.java 2KB
.project 2KB
WebRoot
rtcclientC.jsp 9KB
rtcclientB.jsp 9KB
channel.js 62KB
copyindex.jsp 11KB
clientC.jsp 4KB
manyrtcclientB.jsp 12KB
manyrtcclientC.jsp 12KB
META-INF
MANIFEST.MF 36B
WEB-INF
web.xml 4KB
classes
com
acgist
rtc
ClientBServlet.class 1KB
WebSoketRTCTest.class 4KB
ClientCServlet.class 1KB
ClientAServlet.class 1KB
manyrtc
ClientBServlet.class 1KB
WebSoketRTCTest.class 4KB
ClientCServlet.class 1KB
ClientAServlet.class 1KB
websoket
WebSoketTest.class 4KB
ClientBServlet.class 1KB
ClientCServlet.class 1KB
ClientAServlet.class 1KB
demo
Msg.class 2KB
AcgistVideo.class 3KB
AcgistVideoCopy.class 3KB
Client.class 2KB
Msg1.class 3KB
lib
javax.websocket-api-1.0.jar 36KB
clientA.jsp 4KB
rtcclientA.jsp 9KB
manyrtcclientA.jsp 12KB
index.jsp 11KB
clientB.jsp 4KB
CopyrtcclientC.jsp 9KB
.mymetadata 291B
.classpath 594B
共 60 条
- 1
老何_低调
- 粉丝: 126
- 资源: 47
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C#ASP.NET医院管理系统源码数据库 SQL2008源码类型 WinForm
- 犀牛(Rhino)批量导出STL格式文件
- 在Windows10/11安装免费的HEVC解码插件
- remote_latest.apk
- intel dx79 最新bios intel-six7910j-86A-0424-bi.zip
- 在.NET 6中使用Serilog收集日志
- 单开线程处理串口通信 qt
- intel dx58so2 最新bios sox5820j.86a.0920.bi.zxip
- C#大型体检系统源码 PEIS医院体检管理系统源码数据库 SQL2008源码类型 WinForm
- intel dh87mc 主板最新bios 0164版
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页