1,nginx-lua

需要设置nginx配置文件

    resolver 223.5.5.5 223.6.6.6;
lua_package_path "/usr/local/nginx/conf/lua-resty-http/lib/?.lua;/usr/local/nginx/conf/lua-resty-string/lib/?.lua;;";
init_worker_by_lua_file /usr/local/nginx/conf/init.lua;

代码

local sleepTime =
local remoteIp = "127.0.0.1"
local remotePort = local function getLocalClient()
return "clientOne" , nil
end local function encryptMessage(skey, msg)
local aes = require "resty.aes"
local str = require "resty.string"
local aes_128_cbc_with_iv = assert(aes:new(skey, nil, aes.cipher(,"cbc"), {iv=""}))
local encrypted = ngx.encode_base64(aes_128_cbc_with_iv:encrypt(msg))
return encrypted
end local function decryptMessage(skey, msg)
local aes = require "resty.aes"
local str = require "resty.string"
local aes_128_cbc_with_iv = assert(aes:new(skey, nil, aes.cipher(,"cbc"), {iv=""}))
local decrypted = aes_128_cbc_with_iv:decrypt(ngx.decode_base64(msg))
return decrypted
end local function modifySleeptime()
sleepTime = math.random()
end local function sendMessage(sock, skey, msg, pkgtype)
if pkgtype == "hello" then
msg = msg
else
msg = encryptMessage(skey, msg)
end
local len = string.len(msg)
local res={,,,}
local num = len
local n = math.ceil(select(,math.frexp(num))/)
for k=n,,- do
local mul=^(*(k-))
res[k]=math.floor(num/mul)
num=num-res[k]*mul
end sock:send(string.char(res[]) .. string.char(res[]) .. string.char(res[]) .. string.char(res[]) .. msg)
end local function recvMessage(sock, skey)
sock:settimeout()
local line, err, partial = sock:receive()
if not line then
return nil, err
end local len = string.byte(line,) + string.byte(line,)* + string.byte(line,)** + string.byte(line,)***
local msg, err, partial = sock:receive(len)
if not msg then
return nil, err
end
msg = decryptMessage(skey, msg)
return msg, nil
end local function handle(sock, client, skey)
local connect =
sendMessage(sock, skey, client, "connect")
local skey, err = recvMessage(sock, skey)
if not skey then
ngx.timer.at(sleepTime, loop)
modifySleeptime()
return
end
while true do
connect = connect + if ngx.worker.exiting() then
return "exit"
end local msg, err = recvMessage(sock, skey)
if not msg then
_, pos = string.find(err, "timeout")
if pos ~= nil and connect < then
sendMessage(sock, skey, "hello", "hello")
else
sock:close()
return "connection error or closed"
end
else
connect =
msg = string.gsub(msg, "^%s*(.-)%s*$", "%1") local http = require("resty.http")
local httpc = http.new()
local res, err = httpc:request_uri("http://www.ciaos.com"..msg, {
method = "GET",
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
}
})
local result
if not res then
result = err
else
result = res.body
end
sendMessage(sock, skey, result, "message")
end
end
end local function loop()
local client, err = getLocalClient()
if not client then
ngx.timer.at(sleepTime, loop)
modifySleeptime()
return
end while true do
if ngx.worker.exiting() then
break
end
local sock = ngx.socket.tcp()
local ok, err = sock:connect(remoteIp, remotePort)
if not ok then
ngx.timer.at(sleepTime, loop)
modifySleeptime()
return
else
local err = handle(sock, client, "a$ef&_12b(*;32a1")
if err then
ngx.timer.at(sleepTime, loop)
modifySleeptime()
break
end
end
end
end ngx.timer.at(, loop)

golang(需要依赖gotcp项目)

代码

// server/server.go

package main

import (
"encoding/binary"
"fmt"
"log"
"net"
"os"
"os/signal"
"runtime"
"syscall"
"time" "auth"
"gotcp"
"proto"
) var clientMap map[uint32]*gotcp.Conn type Callback struct{} func (this *Callback) OnConnect(c *gotcp.Conn) bool {
addr := c.GetRawConn().RemoteAddr()
c.PutExtraData(addr)
fmt.Println("OnConnect["+time.Now().Format("2006-01-02 15:04:05")+"]:", addr)
return true
} func (this *Callback) OnMessage(c *gotcp.Conn, p gotcp.Packet) bool {
rcPacket := p.(*proto.RcPacket) var msgtype string
if c.GetFirstPackageFlag() {
msgtype = "auth" c.SetFirstPackageFlag()
uclientid, skey, err := auth.GetClientId(rcPacket.GetBody())
if err != nil {
fmt.Printf("OnMessage["+time.Now().Format("2006-01-02 15:04:05")+"]: %v MsgType[%v] MsgLen[%v] MsgBody[%v] AuthError[%v]\n", c.GetRawConn().RemoteAddr(), msgtype, rcPacket.GetLength(), string(rcPacket.GetBody()), err.Error())
c.Close()
return false
}
c.SetClientId(uclientid)
clientMap[uclientid] = c
bSkey := []byte(skey)
c.AsyncWritePacket(proto.NewRcPacket(bSkey, false), time.Second)
} else {
msgtype = "resp" if rcPacket.GetLength() == && string(rcPacket.GetBody()) == "hello" {
fmt.Printf("OnHello["+time.Now().Format("2006-01-02 15:04:05")+"]:%v ClientId[%v]\n", c.GetRawConn().RemoteAddr(), c.GetClientId())
return true
}
c.GetRelateConn().AsyncWritePacket(proto.NewRcPacket(rcPacket.Serialize(), true), time.Second)
c.Cmutex.Unlock()
} fmt.Printf("OnMessage["+time.Now().Format("2006-01-02 15:04:05")+"]:%v ClientId[%v] MsgType[%v] MsgLen[%v] MsgBody[%v]\n", c.GetRawConn().RemoteAddr(), c.GetClientId(), msgtype, rcPacket.GetLength(), string(rcPacket.GetBody())) return true
} func (this *Callback) OnClose(c *gotcp.Conn) {
fmt.Println("OnClose["+time.Now().Format("2006-01-02 15:04:05")+"]:", c.GetExtraData())
if c.GetRelateConn() != nil {
c.GetRelateConn().Close()
}
delete(clientMap, c.GetClientId())
} type InnerCallback struct{} func (this *InnerCallback) OnConnect(c *gotcp.Conn) bool {
addr := c.GetRawConn().RemoteAddr()
c.PutExtraData(addr)
fmt.Println("Inner OnConnecti["+time.Now().Format("2006-01-02 15:04:05")+"]:", addr)
return true
} func (this *InnerCallback) OnMessage(c *gotcp.Conn, p gotcp.Packet) bool {
rcPacket := p.(*proto.RcPacket) clientid := binary.LittleEndian.Uint32(rcPacket.GetBody()[:])
fmt.Printf("OnMessage["+time.Now().Format("2006-01-02 15:04:05")+"]: %v ClientId[%v] MsgType[%v] MsgLen[%v] MsgBody[%v]\n", c.GetRawConn().RemoteAddr(), clientid, "req", rcPacket.GetLength(), string(rcPacket.GetBody()))
if conn, ok := clientMap[clientid]; ok {
conn.Cmutex.Lock()
conn.SetRelateConn(c)
conn.AsyncWritePacket(proto.NewRcPacket(rcPacket.GetBody()[:], false), time.Second)
} else {
c.Close()
return false
}
return true
} func (this *InnerCallback) OnClose(c *gotcp.Conn) {
fmt.Println("Inner OnClose["+time.Now().Format("2006-01-02 15:04:05")+"]:", c.GetExtraData())
} func outer() *gotcp.Server {
// creates a tcp listener
tcpAddr, err := net.ResolveTCPAddr("tcp4", ":9527")
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err) // creates a server
config := &gotcp.Config{
PacketSendChanLimit: ,
PacketReceiveChanLimit: ,
}
srv := gotcp.NewServer(config, &Callback{}, &proto.RcProtocol{}) // starts service
go srv.Start(listener, time.Second)
fmt.Println("listening:", listener.Addr()) return srv
} func inner() *gotcp.Server {
// creates a tcp listener
tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:9528")
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err) // creates a server
config := &gotcp.Config{
PacketSendChanLimit: ,
PacketReceiveChanLimit: ,
}
srv := gotcp.NewServer(config, &InnerCallback{}, &proto.RcProtocol{}) // starts service
go srv.Start(listener, time.Second)
fmt.Println("listening:", listener.Addr()) return srv
} func main() {
runtime.GOMAXPROCS(runtime.NumCPU()) clientMap = make(map[uint32]*gotcp.Conn) innerSvr := inner()
outerSvr := outer() // catchs system signal
chSig := make(chan os.Signal)
signal.Notify(chSig, syscall.SIGINT, syscall.SIGTERM)
fmt.Println("Signal: ", <-chSig) // stops service
innerSvr.Stop()
outerSvr.Stop()
} func checkError(err error) {
if err != nil {
log.Fatal(err)
}
}
// auth/auth.go

package auth

import (
"fmt"
"io/ioutil"
"net/http"
"strconv"
"strings"
) func GetClientId(message []byte) (uint32, string, error) {
res, err := http.Post("http://www.ciaos.com/service/token", "application/x-www-form-urlencoded", strings.NewReader("param="+string(message)))
if err != nil {
return , "", err
}
result, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
return , "", err
}
info := strings.Split(string(result), " ")
clientid, err := strconv.Atoi(info[])
uclientid := uint32(clientid)
skey := info[]
return uclientid, skey, nil
}

gotcp中conn.go文件修改如下

type Conn struct {
srv *Server
conn *net.TCPConn // the raw connection
extraData interface{} // to save extra data
closeOnce sync.Once // close the conn, once, per instance
closeFlag int32 // close flag
closeChan chan struct{} // close chanel
packetSendChan chan Packet // packet send chanel
packetReceiveChan chan Packet // packet receive chanel isFirstPackage bool // first packet
clientId uint32 // remote client id
relateConn *Conn // the relate controll connection
Cmutex sync.Mutex // mutex
}

php代码如下

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Service extends CI_Controller {

    private function genToken($clientid)
{
return "abcdefghijklmnop";
} private function getClientId($client)
{
return 1002;
} //Get Token
public function token()
{
$_KEY = "a\$ef&_12b(*;32a1";
$param = $this->input->post("param");
if($param)
{
$client = openssl_decrypt(base64_decode($param), 'aes-128-cbc', $_KEY, true, '1234567890123456');
$clientid = self::getClientId($client); $token = self::genToken($clientid); $this->redis->select(1);
$this->redis->setex($clientid, 1800, $token);
$message = base64_encode(openssl_encrypt($token, 'aes-128-cbc', $_KEY, true,'1234567890123456'));
echo $clientid." ".$message;
}
else{
show_404();
}
} //Controll Message
public function console()
{
$id = $this->input->get("id");
$command = $this->input->get("cmd");
if(is_null($command) or $command == false or $id === false or is_null($id)){
echo "invalid cmd";
return;
}
$port = 9528;
$ip = "127.0.0.1";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "internal server error:1";
return;
} $result = socket_connect($socket, $ip, $port);
if (!$result) {
echo "internal server error:2";
return;
} $this->redis->select(1);
$stoken = $this->redis->get($id);
if(is_null($stoken)){
echo "internal server error:3";
return;
}
$message = openssl_encrypt($command,'aes-128-cbc',$stoken, true,'1234567890123456');
$message = base64_encode($message);
$len = strlen($message)+4;
$bin_head = pack("ii", $len, $id);
socket_write($socket, $bin_head, strlen($bin_head));
$in = $message;
if(!socket_write($socket, $in, strlen($in))) {
echo "internal server error:5";
return;
} $out = socket_read($socket, 4);
if($out && strlen($out)>0){
$data = unpack("i", $out);
$out = socket_read($socket, $data[1]);
if($out){
$message = openssl_decrypt(base64_decode($out), 'aes-128-cbc', $stoken, true, '1234567890123456');
echo $message;
socket_close($socket);
return;
}
}
socket_close($socket);
echo "internal server error: 4";
}
} /* End of file service.php */
/* Location: ./application/controllers/service.php */

最新文章

  1. android笔记:获取View组件宽度以及ViewTreeObserver
  2. POJO(PO)与javaBean的比较、以及DTO的说明
  3. C#基础总结之一变量常量-if嵌套语句-witch结构-类型转换
  4. 一起用HTML5 canvas做一个简单又骚气的粒子引擎
  5. 阿里巴巴fastJson进行json数据解析
  6. 通过Javascript模拟登陆Windows认证的网站
  7. Activity的启动模式(android:launchMode)
  8. CSS随手记
  9. Android permission 访问权限
  10. mongo细节
  11. JS事件绑定深入
  12. 《Algorithms Unlocked》读书笔记2——二分查找和排序算法
  13. python之函数对象、函数嵌套、名称空间与作用域、装饰器
  14. PowerDesigner设置Oracle不区分大小写
  15. 解决MySQL数据库连接太多,多数Sleep
  16. 「洛谷2495」「BZOJ3052」「SDOI2001」消耗战【虚树+树形动态规划】
  17. 10、DOM(文档对象模型)
  18. Javascript 面向对象编程2:构造函数的继承
  19. (HDU 1542) Atlantis 矩形面积并——扫描线
  20. [UE4]基于物理的材质

热门文章

  1. Notes里OK,CANCEL按钮的设定
  2. 如何使Label带有链接??此法感觉有点取巧!!!
  3. Java Scoket之java.io.EOFException解决方案
  4. 快速傅里叶变换FFT
  5. oracle sql命令行中上下左右使用
  6. 关于SYN洪泛攻击简介
  7. 经常使用的DB2命令(2)
  8. Canvas标签初探
  9. 【原】浅谈Firefox下的js、css、图片阻塞现象(一)
  10. Ubuntu常用命令整理