请问你是写了一个adcjavasScoket点对点类似聊天室的项目吗 能发给我一份吗

您浏览的页面不存在
信息提示:
您要浏览的文章不存在,5秒后将自动跳转到“360doc个人图书馆”的首页,您可以继续浏览其它好文章,也可以&
&当前页面。* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11080次
排名:千里之外
转载:13篇
评论:14条
(5)(1)(2)(7)(4)请问用Java写一个简易的局域网聊天室需要J2SE的哪些基础?_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:209,046贴子:
请问用Java写一个简易的局域网聊天室需要J2SE的哪些基础?收藏
朋友请我帮他写一个聊天室,分客户端和服务器端。我目前已经学完了基本语法、面向对象、常用类、线程、网络,还没有学数组、异常处理、IO、容器、GUI。以我现在的知识能写吗?
会打 helloWord就行~~~
为什么要有服务器端不是点对点吗
可以写,通信主要用到网络相关的Socket类。其他的都是常见的东西,这种例子在网上应该比较好找。
网络都学了。还在纠结这个?
———————————Love is ever betrayed only fickle just let people remember。 请叫我 七轩
服务端用serverSocket 客户端用socket 加入多线程 每一个线程代表一个客户端,但是界面的话...
会用RMI的话更好,我有特别的实现聊天室的技巧
学点mvc吧!其实你有这些基础已经够了!    ------迷恋,是一种态度!
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
为兴趣而生,贴吧更懂你。或本站专栏文章皆为原创,转载请注明出处(带有 前端乱炖 字样)和本文的显式链接(),本站和作者保留随时要求删除文章的权利!
WRITTEN BY
PUBLISHED IN
本专栏其他文章
浏览:1313赞:0
浏览:613赞:0
浏览:831赞:1
浏览:1771赞:0使用WebRTC搭建前端视频聊天室——入门篇 | 天镶的博客使用WebRTC搭建前端视频聊天室——入门篇由于毕设研究定的题目是即时通信相关,于是乎决定研究一下WebRTC来实现浏览器内的音频聊天,同时探究一下WebRTC能做些什么
什么是WebRTC?
众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转。比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器、乙和服务器之间建立信道。甲给乙发送消息时,甲先将消息发送到服务器上,服务器对甲的消息进行中转,发送到乙处,反过来也是一样。这样甲与乙之间的一次消息要通过两段信道,通信的效率同时受制于这两段信道的带宽。同时这样的信道并不适合数据流的传输,如何建立浏览器之间的点对点传输,一直困扰着开发者。WebRTC应运而生
WebRTC是一个开源项目,旨在使得浏览器能为实时通信(RTC)提供简单的JavaScript接口。说的简单明了一点就是让浏览器提供JS的即时通信接口。这个接口所创立的信道并不是像WebSocket一样,打通一个浏览器与WebSocket服务器之间的通信,而是通过一系列的信令,建立一个浏览器与浏览器之间(peer-to-peer)的信道,这个信道可以发送任何数据,而不需要经过服务器。并且WebRTC通过实现MediaStream,通过浏览器调用设备的摄像头、话筒,使得浏览器之间可以传递音频和视频
WebRTC已经在我们的浏览器中
这么好的功能,各大浏览器厂商自然不会置之不理。现在WebRTC已经可以在较新版的Chrome、Opera和Firefox中使用了,著名的浏览器兼容性查询网站caniuse上给出了一份详尽的浏览器兼容情况
另外根据36Kr前段时间的新闻和,Android也开始支持WebRTC
WebRTC实现了三个API,分别是:
MediaStream:通过MediaStream的API能够通过设备的摄像头及话筒获得视频、音频的同步流
RTCPeerConnection:RTCPeerConnection是WebRTC用于构建点对点之间稳定、高效的流传输的组件
RTCDataChannel:RTCDataChannel使得浏览器之间(点对点)建立一个高吞吐量、低延时的信道,用于传输任意数据
这里大致上介绍一下这三个API
MediaStream(getUserMedia)
MediaStream API为WebRTC提供了从设备的摄像头、话筒获取视频、音频流数据的功能
同门可以通过调用navigator.getUserMedia(),这个方法接受三个参数:
一个约束对象(constraints object),这个后面会单独讲
一个调用成功的回调函数,如果调用成功,传递给它一个流对象
一个调用失败的回调函数,如果调用失败,传递给它一个错误对象
浏览器兼容性
由于浏览器实现不同,他们经常会在实现标准版本之前,在方法前面加上前缀,所以一个兼容版本就像这样
var getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia)
一个超级简单的例子
这里写一个超级简单的例子,用来展现getUserMedia的效果:
&!doctype html&
lang="zh-CN"&
charset="UTF-8"&
&GetUserMedia实例&
id="video" autoplay&&
type="text/javascript"&
var getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
getUserMedia.call(navigator, {
video: true,
audio: true
}, function(localMediaStream) {
var video = document.getElementById('video');
video.src = window.URL.createObjectURL(localMediaStream);
video.onloadedmetadata = function(e) {
console.log("Label: " + localMediaStream.label);
console.log("AudioTracks" , localMediaStream.getAudioTracks());
console.log("VideoTracks" , localMediaStream.getVideoTracks());
}, function(e) {
console.log('Reeeejected!', e);
将这段内容保存在一个HTML文件中,放在服务器上。用较新版本的Opera、Firefox、Chrome打开,在浏览器弹出询问是否允许访问摄像头和话筒,选同意,浏览器上就会出现摄像头所拍摄到的画面了
注意,HTML文件要放在服务器上,否则会得到一个NavigatorUserMediaError的错误,显示PermissionDeniedError,最简单方法就是cd到HTML文件所在目录下,然后python -m SimpleHTTPServer(装了python的话),然后在浏览器中输入http://localhost:8000/{文件名称}.html
这里使用getUserMedia获得流之后,需要将其输出,一般是绑定到video标签上输出,需要使用window.URL.createObjectURL(localMediaStream)来创造能在video中使用src属性播放的Blob URL,注意在video上加入autoplay属性,否则只能捕获到一张图片
流创建完毕后可以通过label属性来获得其唯一的标识,还可以通过getAudioTracks()和getVideoTracks()方法来获得流的追踪对象数组(如果没有开启某种流,它的追踪对象数组将是一个空数组)
约束对象(Constraints)
约束对象可以被设置在getUserMedia()和RTCPeerConnection的addStream方法中,这个约束对象是WebRTC用来指定接受什么样的流的,其中可以定义如下属性:
video: 是否接受视频流
audio:是否接受音频流
MinWidth: 视频流的最小宽度
MaxWidth:视频流的最大宽度
MinHeight:视频流的最小高度
MaxHiehgt:视频流的最大高度
MinAspectRatio:视频流的最小宽高比
MaxAspectRatio:视频流的最大宽高比
MinFramerate:视频流的最小帧速率
MaxFramerate:视频流的最大帧速率
RTCPeerConnection
WebRTC使用RTCPeerConnection来在浏览器之间传递流数据,这个流数据通道是点对点的,不需要经过服务器进行中转。但是这并不意味着我们能抛弃服务器,我们仍然需要它来为我们传递信令(signaling)来建立这个信道。WebRTC没有定义用于建立信道的信令的协议:信令并不是RTCPeerConnection API的一部分
既然没有定义具体的信令的协议,我们就可以选择任意方式(AJAX、WebSocket),采用任意的协议(SIP、XMPP)来传递信令,建立信道,比如我写的,就是用的node的ws模块,在WebSocket上传递信令
session的信息:用来初始化通信还有报错这些信息的交换应该在点对点的流传输之前就全部完成,一个大致的架构图如下:
通过服务器建立信道
这里再次重申,就算WebRTC提供浏览器之间的点对点信道进行数据传输,但是建立这个信道,必须有服务器的参与。WebRTC需要服务器对其进行四方面的功能支持:
用户发现以及通信
NAT/防火墙穿越
如果点对点通信建立失败,可以作为中转服务器
NAT/防火墙穿越技术
建立点对点信道的一个常见问题,就是NAT穿越技术。在处于使用了NAT设备的私有TCP/IP网络中的主机之间需要建立连接时需要使用NAT穿越技术。以往在VoIP领域经常会遇到这个问题。目前已经有很多NAT穿越技术,但没有一项是完美的,因为NAT的行为是非标准化的。这些技术中大多使用了一个公共服务器,这个服务使用了一个从全球任何地方都能访问得到的IP地址。在RTCPeeConnection中,使用ICE框架来保证RTCPeerConnection能实现NAT穿越
浏览器兼容
还是前缀不同的问题,采用和上面类似的方法:
var PeerConnection = (window.PeerConnection ||
window.webkitPeerConnection00 ||
window.webkitRTCPeerConnection ||
window.mozRTCPeerConnection);
创建和使用
var iceServer = {
"iceServers": [{
"url": "stun:stun.:19302"
var getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
var PeerConnection = (window.PeerConnection ||
window.webkitPeerConnection00 ||
window.webkitRTCPeerConnection ||
window.mozRTCPeerConnection);
var socket = __createWebSocketChannel();
var pc = new PeerConnection(iceServer);
pc.onicecandidate = function(event){
socket.send(JSON.stringify({
"event": "__ice_candidate",
"candidate": event.candidate
pc.onaddstream = function(event){
someVideoElement.src = URL.createObjectURL(event.stream);
getUserMedia.call(navigator, {
"audio": true,
"video": true
}, function(stream){
var sendOfferFn = function(desc){
pc.setLocalDescription(desc);
socket.send(JSON.stringify({
"event": "__offer",
"sdp": desc
sendAnswerFn = function(desc){
pc.setLocalDescription(desc);
socket.send(JSON.stringify({
"event": "__answer",
"sdp": desc
myselfVideoElement.src = URL.createObjectURL(stream);
pc.addStream(stream);
if(isCaller){
pc.createOffer(sendOfferFn);
pc.createAnswer(sendAnswerFn);
}, function(error){
socket.onmessage = function(event){
var json = JSON.parse(event.data);
if( json.event === "__ice_candidate" ){
pc.addIceCandidate(new RTCIceCandidate(json.data.candidate));
pc.setRemoteDescription(new RTCSessionDescription(json.data.sdp));
由于涉及较为复杂灵活的信令传输,故这里不做简短的实例,可以直接移步到最后
RTCDataChannel
既然能建立点对点的信道来传递实时的视频、音频数据流,为什么不能用这个信道传一点其他数据呢?RTCDataChannel API就是用来干这个的,基于它我们可以在浏览器之间传输任意数据。DataChannel是建立在PeerConnection上的,不能单独使用
使用DataChannel
我们可以使用channel = pc.createDataCHannel(&someLabel&);来在PeerConnection的实例上创建Data Channel,并给与它一个标签
DataChannel使用方式几乎和WebSocket一样,有几个事件:
同时它有几个状态,可以通过readyState获取:
connecting: 浏览器之间正在试图建立channel
open:建立成功,可以使用send方法发送数据了
closing:浏览器正在关闭channel
closed:channel已经被关闭了
两个暴露的方法:
close(): 用于关闭channel
send():用于通过channel向对方发送数据
通过Data Channel发送文件大致思路
JavaScript已经提供了File API从input[type='file']的元素中提取文件,并通过FileReader来将文件的转换成DataURL,这也意味着我们可以将DataURL分成多个碎片来通过Channel来进行文件传输
一个综合的Demo
,这是我写的一个Demo。建立一个视频聊天室,并能够广播文件,当然也支持单对单文件传输,写得还很粗糙,后期会继续完善
下载解压并cd到目录下
运行npm install安装依赖的库(express, ws, node-uuid)
运行node server.js,访问localhost:3000,允许摄像头访问
打开另一台电脑,在浏览器(Chrome和Opera,还未兼容Firefox)打开{server所在IP}:3000,允许摄像头和话筒访问
广播文件:在左下角选定一个文件,点击“发送文件”按钮
广播信息:左下角input框输入信息,点击发送
可能会出错,注意F12对话框,一般F5能解决
视频音频聊天(连接了摄像头和话筒,至少要有摄像头),广播文件(可单独传播,提供API,广播就是基于单独传播实现的,可同时传播多个,小文件还好说,大文件坐等内存吃光),广播聊天信息}

我要回帖

更多关于 javas 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信