当前位置: 首页 > 后端技术 > Node.js

GolangTcpProxy和NodejsTcpProxy

时间:2023-04-03 13:05:37 Node.js

我平时的工作基本上是在php和nodejs之间徘徊,但是现在面对python和java的猛烈攻击,心里其实隐隐隐隐作痛“PHP是世界上最好的语言”,“CPU密集时nodejs服务完全瘫痪”。..看了半个月的python,发现其实和php语言太像了,所以基本是通俗易懂的。看golang一个多月了,确实要多写多看源码才能有所收获。别看只有30个关键词,内容真的很多。golang的性能真的很高,可以大大降低服务器的开销。比如PHP在web服务中需要100台机器,那么golang可能只需要10台甚至更少!最近在研究mysql代理。其实mysql本身是支持proxies的,但是如果你想自己试试,会很灵活:flexibleslbmysqlloadbalancingreadandwritedirectlythroughtheproxytodirectlyjudgederroringwarningorrejectdangeroussql...toomuchToo好处多以下是golangmysql代理包的代码mainimport("net""fmt""time")const(MYSQL_ADDRESS="mysq-host"MYSQL_PORT="3306")funcmain(){listener,err:=net.Listen("tcp",":1234")iferr!=nil{fmt.Println("tcp",err.Error())返回}else{fmt.Println("tcp",listener.Addr(),"success")}for{user,err:=listener.Accept()iferr!=nil{fmt.Println("accepterror:",err.Error())continue}goproxyRequest(user)}}//处理用户请求funcproxyRequest(usernet.Conn){fmt.Println(user.LocalAddr())bytes:=make([]byte,10240)conn,err:=net.Dial("tcp",MYSQL_ADDRESS+":"+MYSQL_PORT)iferr!=nil{fmt.Println(conn.RemoteAddr(),"error:",err.Error())连接。Close()返回}ch:=make(chanbool,1)goproxyResponse(user,conn,ch)for{n,err:=user.Read(bytes)iferr!=nil{break}fmt.Println(string(bytes[:n]))conn.Write(bytes[:n])}deferclose(ch)select{case<-ch:conn.Close()user.Close()fmt.Println("proxyover")case<-time.After(time.Second*60):fmt.Println("proxytimeout")}}//代理服务的返回给用户funcproxyResponse(usernet.Conn,servicenet.Conn,chchanbool){bytes:=make([]byte,10240)for{n,err:=service.Read(bytes)iferr!=nil{break}user.Write(bytes[:n])}ch<-true}以下是nodejs简单的proxyvarnet=require('net');varmodel=require('../../models/proxy');vartrace=require('../../libs/trace');//代理表varproxys=[];//tcpservervarserver=null;//代理信息varinformation={count:0,success:0,error:0};/***启动服务*@param信息数组*@param回调函数*/exports.start=(info,callback)=>{model.getProxyListFromServer(info.id,(err,result)=>{if(err){callback(err,err);}else{proxys=result;initServer(info.port,info.to_host,info.to_port);callback(null);}});};/***停止服务。*@returnbool*/exports.stop=function(){if(server&&server.listening){server.close();服务器=空;返回真;}returnfalse;};/***获取信息*@returnobject*/exports.getInfo=()=>{returninformation;};/***初始化tcp代理服务器。*@paramport*@paramtoHost*@paramtoPort*/functioninitServer(port,toHost,toPort){server=net.createServer((client)=>{information.count++;client.on('end',()=>{connect.end();});varconnect=net.createConnection({host:toHost,port:toPort},(err)=>{});connect.on('error',(err)=>{information.error++;});connect.on('end',()=>{information.success++;});client.pipe(connect);connect.pipe(client);//client.on('data',function(data){//varbuf=Buffer.from(data);//console.log('data:'+buf.toString());//});});server.listen(port,(err)=>{if(err){trace.log('代理服务器错误',err);process.exit();}trace.log('代理服务器启动',port);});}