java使用websocket和WebRTC视频通话
来源:互联网 发布:.net软件开发 编辑:程序博客网 时间:2024/05/28 04:54
http://www.acgist.com/article/72.html
java使用websocket和WebRTC视频通话
2014年05月28日 这两天终于是抽了时间把WebRTC搞定了,去年就想弄的,但是确实没时间,而且那时候javaEE的websocket还没有规范,网上也都是用的tomcat自己的websocket实现的,或者还使用了一些ajax辅助,javaEE7中有了websocket的规范,tomcat也支持,所以最近也是写了出来。
首先WebRTC,这个可以百度一下,大概就是一个音频和视频通讯技术,可以跨平台,只要能用浏览器的基本都可以使用,当然要你的浏览器支持。但是这东西好像是有规范,但是各个浏览器实现方式有些不一样,我这里主要使用的是chrome做的例子。地址在:http://www.acgist.com/demo/video(如果很长时间没有加载出来,对不起,很可能是你上不了google)。
使用到的javascript都在页面上面都有,注释也差不多写了,我这里也不贴出来了。还有就是引用了google的js库:channel.js。不过还是下载下来放到本地服务器吧,因为很多地方访问google.com很吃力啊。最开始就是这个js没有加载完郁闷了很久,还一直以为是代码写错了。
另外在进入页面的时候,注意初始化页面js中的一个参数:initiator:如果是创建人这个参数设为false;如果是加入的时候这个设置为true。为true的时候,才会发起视频通话的请求
这里我主要贴一下服务端的代码,其实服务端代码很简单,就是收到用户的请求,发送给另外一个用户就可以了,这里处理的其实是用户WebRTC的一些信息,并不是去传输视频,如下:
import
java.io.IOException;
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
(
"/acgist.video/{uid}"
)
public
class
AcgistVideo {
// 最大通话数量
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);
sessions.put(uid, session);
}
/**
* 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
{
if
(uid !=
null
&& user_user.get(uid) !=
null
&& AcgistVideo.sessions.get(user_user.get(uid)) !=
null
) {
Session osession = sessions.get(user_user.get(uid));
// 被呼叫的session
if
(osession.isOpen())
osession.getAsyncRemote().sendText(
new
String(message.getBytes(
"utf-8"
)));
else
this
.nowaiting(osession);
}
else
{
this
.nowaiting(session);
}
}
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 uid, String oid) {
if
(oid !=
null
&& !oid.isEmpty()) {
AcgistVideo.user_user.put(uid, oid);
AcgistVideo.user_user.put(oid, uid);
return
false
;
}
else
{
AcgistVideo.user_user.put(uid,
null
);
return
true
;
}
}
/**
* 移除聊天用户
* @param session 移除的session
* @param uid 移除的UID
*/
private
static
void
remove(Session session, String 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();
}
}
}
上面最主要的就是onMessage方法,其他很多都是一些辅助方法。注意这个需要使用到javaEE7的新内容,所以服务器请使用tomcat8。
例子下载:http://pan.baidu.com/s/1mgFkXHe
参考文章:http://blog.csdn.net/leecho571/article/details/8146525
这个是国外的一个例子(功能比较多):https://talky.io/
下面是截图(不要吐槽看不清楚啊,是上传那里压缩图片写的不好):
注:有时候会断开连接,大概是STUN服务器连接不上吧。
- java使用websocket和WebRTC视频通话
- Java使用websocket和WebRTC实现视频通话
- Java+WebSocket+WebRTC实现视频通话实例
- 基于Chrome、Java、WebSocket、WebRTC实现浏览器视频通话
- 基于Chrome、Java、WebSocket、WebRTC实现浏览器视频通话
- 基于Chrome、Java、WebSocket、WebRTC实现浏览器视频通话
- 基于Chrome、Java、WebSocket、WebRTC实现浏览器视频通话
- Java通过WebSocket WebRTC实现视频通话实例
- webRtc+websocket多人视频通话
- ionic2集成crosswalk使用WebRTC视频通话
- webrtc (3) 使用webrtc Native API实现视频通话
- android WebRTC视频通话
- 使用Resiprocate 部署 WebRTC IM 视频通话平台
- webRTC视频通话,https协议,录制端和播放端
- 使用webRTC通话Demo
- WebRTC 点对点视频通话系统
- WebRtc 视频通话(网页对网页)
- 使用WebRTC实现电脑与手机通过浏览器进行视频通话
- 删除mssql里所有的表
- 公众上网场所行业领导者顺网科技,何以成为VR重角?
- 禁止Html5在手机上屏幕页面缩放
- 为什么iBatis+Oracle的executeBatch总是返回0?
- Springmvc工作原理
- java使用websocket和WebRTC视频通话
- VI操作
- IOS AFNetworking3.0 SDImage 网络请求和图片加载
- 添加自定义的tabBar
- 输入边数打印菱形
- gulp构建工具整理
- 从另外角度-解决ASP.NET每一个页面首次访问慢的问题
- 关于dubbo服务的xml配置文件报错的问题
- maven 仓库搜索服务(地址)