A. 如果用nodejs写流媒体服务器,那客户端播放有什么解决方案
这个问题其实跟服务器具体用什么技术实现无关,而主要跟流媒体的传输方式有关: 1.下载 2.流式传输
如果是下载方式,那么一般就是基于http协议 如果是流式传输,那么一般就是基于rtmp协议
所有这里需要关注具体的方式和协议,推荐的播放器(web端)有jwpalyer
后端一般用现成的服务器:nginx 、red 5 、 flash media server 等
其中 red 5 为开源产品,支持 rtmp 协议,但目前版本对集群支持有一些问题~
B. nodejs可以接受tcp服务器的数据吗
nodejs中我们使用net模块来创建tcp服务器,tcp客户端,实现服务器与客户端拍樱宴之前的数据通信
创建tcp服务器
var server=net.createServer([optations],[connectionListener])
optations:{allowHalfOpen:boolean}
allowHalfOpen:false 当服务器接受到客户端发送的一个FIN包时候,会回发一个FIN包,当为true时服务器不会回FIN包,使得tcp服务器可以继续发送数据到客户端,但是不会接受客户端发送的数据,开发者必须调动end方法来关闭socket,默认是false
connectionListener:当客户端与服务器连接上了,可以触发的回袭银调函数。
function(socket){
//.......
}
我们也可以不用回调函数来写连接上做什么处理,连接上会触发connection事件
var server=net.createServer()返回创建的tcp服务器
我们可以server.on('connection',function(socket){
})
在创建完tcp服务器我们通知服务器要监听客户端连接
server.listen(port,[host],[backlog],[callback])
port:监听的端口,为0时候tcp服务器分配一个随机的端口
host:监听的ip和主机名,省略该参数,服务器监听任何ipv4地址的客户端连接
backlog:指定等待队列中最大的客户端连接最大数量 默认511
当指定端口、ip这个时候服务器开始监听这个ip这个端口的客户端了,这个时候触发listening事件,可以指定callback参数来处理触发listening具体要做什么
我们也可以
server.on('lisening',function(){
//.......
})
创建一个tcp服务器颂毁后可以用server.address()查看tcp服务器监听的信息
var address=server.address()
addres是一个对象
prot :监听的端口
address:监听的ip
family:ipv4还是ipv6
我们可以使用getConnections()查看与服务器连接的客户端的数量
server.getConnections(callback)
callback:function(err,count){
}
err:错误信息
count:为连接服务器的数量
我们也可以设置最大的连接数,超过这个数字,服务器不允许连接
server.maxConnections=2
服务器关闭
server.close([callback])
这个 方法让tcp服务器拒绝新的客户端连接,原有已经连上的客户端是不关闭的,当所有的连接服务器的客户端关闭时候,服务器默认自动关闭,触发服务器的close事件
下面我们写一个tcp服务器
var net=require("net");
opations={allowHalfOpne:false}
var server=net.createServer(opations);
server.on('connection',function(socket){
server.maxConnections=2;
console.log("服务器最大连接数为%s",server.maxConnections)
server.getConnections(function(err,count){
console.log("已经有%s个客户端连接",count)
})
console.log("%s客户端与服务器建立连接",server.address().address)
})
server.on('error',function(err){
throw err;
})
server.on('listening',function(){
console.log("服务器开始监听%j",server.address())
console.log("服务器开始监听")
})
server.listen(9966,'192.168.0.3');
setTimeout(function(){
server.close(function(){
console.log("tcp服务器关闭11111")
})
console.log("tcp服务器关闭")
},20000)
注意连接成功的时候触发的connection事件,执行的方法,参数是一个socket端口对象,这个就是服务器所监听的端口对象,所以我们socket.address().address返回给我们的是监听ip
socket端口对象
port:端口
address:ip
family:ipv4 ipv6
socket端口对象,可以读取客户端发送的流数据,每次接收到客户端发送的数据触发data事件。
接受客户端发送的消息(在连接成功的触发函数中 让server监听data事件做相应的处理)
server.on('connection',function(socket){
socket.on('data',function(data){
socket.setEncoding("utf-8");
console.log(data)
//console.log(data.toString())
})
})
bytesRead为socket端口对象监听客户端发送的数据字节数
console.log(socket.bytesRead)
当客户端关闭时候,触发socket端口对象的end事件
我们把客户端连接发送的数据保存到一个文件下
var net=require("net");
var fs=require("fs");
var server =net.createServer();
var op={
flags:"a",
encoding:"utf-8"
}
var file=fs.createWriteStream('./socket.txt',op)
server.on('connection',function(socket){
socket.on('data',function(data){
file.write(data);
})
})
server.on('listening',function(){
console.log("监听开始")
})
server.listen('1111','192.168.0.3')
以管道形式发送数据到文件
var net=require("net");
var fs=require("fs");
var server =net.createServer();
var op={
flags:"a",
encoding:"utf-8"
}
var file=fs.createWriteStream('./socket.txt',op)
server.on('connection',function(socket){
//socket.on('data',function(data){
// file.write(data);
//})
socket.pipe(file,{end:false});
socket.on("end",function(){
file.end("wanbi")
})
})
server.on('listening',function(){
console.log("监听开始")
})
server.listen('1111','192.168.0.3')
tcp客户端
创建tcp客户端
var client =new net.socket([opations])
optation:fd 一个现有的socket端口对象文件描述
type :ipv4 、ipv6
allowHalfOpne:true、false
连接服务器
client.connect(prot,[host],[callback])
host不指定默认为本地ip
回调函数表示连接上了做什么
若没有可以socket端口对象触发connect事件
client.on("connect",function(){
})
当我们连接成功后客户端服务器端的socket端口对象有下面的属性
remoteAddress、remotePort、localAddress、localPort
socket端口对象可以写入服务器、客户端流数据
socket.write(data,[encodeing],[callback])
写入数据少时候我们直接写入缓存区,数据很多时候,缓存区满了,我们要把数据写入缓存队列中,这个时候write(data) 返回false,触发drain
我们可以用bufferSize看缓存队列中有多少个字节
socket.on("error",function(err){
})
当遇到error时候这个socket端口对象应该销毁
socket.destory()
socket.end([data],[encoding])
这个方法表示我们要关闭socket端口对象,这个不是关闭服务器的close方法,后者是关闭服务器,实现的效果是不能让客户端连接了,前者是关闭连接(socket端口对象)
当我们使用服务器的socket端口对象(连接客户端得)的end(data,encoding)方法时候,会触发客户端socket端口对象end事件
服务器:
socket.end('88');
客户端会执行下面的代码:
client.on("end",function(){
//......
})
服务器端不会退出应用程序,即使所有的客户端都断开了,这个时候我们要server.unref(),退出程序,可以用server.ref()阻止程序退出.
当socket端口对象彻底关闭时候会触发close事件,我们可以指定当端口对象关闭时候做的处理
socket.on(''close',faction(had_error){
if(had_error){}
else{}
})
socket.writtenBytes表示写了多少个字节
我们tcp服务器与客户端连接了,但是突然间有一个断电了,来不及向另一端发送关闭连接的FIN包,这样另一边这个socket端口永远处于连接状态,我们用socket.setKeepAlive([enable],[inteval])定时向另一端发送监测包,
我们实现一个服务器读一个文件的信息,当有客户单连接上,吧这个信息传给客户端,输出在控制台
服务器代码
var net=require("net");
var fs=require("fs");
var server =net.createServer();
var op={
flags:"r",
encoding:"utf-8"
}
var file=fs.createReadStream('./socket.txt',op)
server.on('connection',function(socket){
file.on('data',function(data){
socket.write(data);
})
socket.on("end",function(){
file.end("wanbi")
})
})
server.on('listening',function(){
console.log("监听开始")
})
server.listen('1111','192.168.0.3')
客户端代码
var net=require("net");
var client=new net.Socket();
client.connect(1111,'192.168.0.3')
client.on('connect',function(){
console.log("ok")
})
client.on("data",function(data){
console.log(data.toString())
})
C. node 怎么在服务器上运行
首先安装node.js环境,windows可以直接下载安装包,下一步到底就可以了~~linux可以使用不同发行版的包管理器(但通常版本都不是最新的),使用最新版本可以从官网下载压缩包,然后解压就可以了,运行node.js代码只需要在命令行中运行node XXX.js(xxx.js为你的代码文件,如果没有将node添加到环境变量,则需要进入node的目录在执行上述命令)~ok 貌似就是这样了~
D. 使用node.js,实现一个简单的接口服务器的功能
varhttp=require('http');
varmysql=require('mysql');
varconnection=mysql.createConnection({
host:'localhost',
user:'me',
password:'secret',
});
//开始你的mysql连接
connection.connect();
varserver=http.createServer(function(req,res){
//如果你发一个GET到http://127.0.0.1:1337/test?a=1&b=2的话
varurl_info=require('url').parse(req.url,true);
//检查是不是给/test的request
if(url_info.pathname==='/test'){
//把query用urlencode,这样可以用post发送
varpost_data=require('querystring').stringify(url_info.query);
//post的option
varpost_options={
host:'localhost',
port:1337,
path:'/response_logic',
method:'POST',
headers:{
'Content-Type':'application/x-www-form-urlencoded',
'Content-Length':post_data.length
}
};
//发出post
varrequest_made=http.request(post_options,function(response_received){
varbuf_list=newArray();
response_received.on('data',function(data){
buf_list.push(data);
});
response_received.on('end',function(){
varresponse_body=Buffer.concat(buf_list);
res.end(response_body);
connection.query('insertinto.........',function(err,rows,fields){
//处理你的结果
});
});
});
//发出post的data
request_made.end(post_data);
}
//这个是用来回复上面那个post的,显示post的数据以表示成功了。你要是有别的目标,自然不需要这一段。
else{
req.pipe(res);
}
});
server.listen(1337,'127.0.0.1');
//在server关闭的时候也关闭mysql连接
server.on('close',function(){
connection.end();
});
console.log('listeningonport1337');