lua zmq 및 socket 통신

5960 단어 Lua

ZMQ 온라인 docs:http://api.zeromq.org/2-1-3:_start
1.서문,zmq 는 통신 이 비교적 좋 고 빠 른 방식 으로 점점 더 많은 개발 자 들 이 사용 합 니 다.
luazmq 의 통신 방식:사례 는 Mac 컴퓨터 에서 작 성 됩 니 다.  1.zmq 에서 req 와 rep 방식 을 먼저 말 하고 rep 는 서버 로 서 req 는 요청 단 으로 하고 req 는 req 의 요청 을 먼저 받 은 후에 만 메 시 지 를 보 낼 수 있 습 니 다.마찬가지 로 req 는 요청 을 보 낸 후에 만 rep 의 메 시 지 를 받 을 수 있 습 니 다.흐름 은 변 하지 않 습 니 다.  상위 코드:  서버 rep: 
require "zhelpers"
local zmq = require "lzmq"  --   zmq    
local context = zmq.context()   --     ZMQ      ,
local publisher, err = context:socket{zmq.REP, bind = "tcp://*:5025"}  --                    5025  
zassert(publisher, err)   --                 
--                    
local y = 0
while y>=0 do 
    local x = "This is a zmq test!"
    y = y + 1
    local ret = zassert(publisher:recv())
    print(y.."rep recv"..ret)
    sleep(1)
    zassert(publisher:send(x))
    -- print(y..":"..x)
end

클 라 이언 트 req:
---------------------------------------req------------------------------------
require "zhelpers"
local zmq = require "lzmq"
local context = zmq.context();
local requester,err = context:socket{zmq.REQ,connect = "tcp://localhost:5025"}
zassert(requester,err)
for i = 1,10 do
    -- print("hello world")
    zassert(requester:send("hello"));
    local ret = requester:recv()
    print("req recv==="..ret)
end

2.방식 2 zmq 의 Sub 와 Pub,게시 와 구독 식,Pub 는 다양한 사용자 에 게 많은 메 시 지 를 발표 할 수 있 습 니 다.Sub 는 filter 를 통 해 자신 이 필요 로 하 는 내용 을 선별 할 수 있 습 니 다:pub 단:
require "zhelpers"
local zmq = require "lzmq"  --   zmq    
local context = zmq.context()   --     ZMQ      ,
local publisher, err = context:socket{zmq.PUB, bind = "tcp://*:7002"}  --                    6801  
zassert(publisher, err)   --                 
--                    
local y = 0
while y>=0 do 
    local x = "This is a zmq test"
    local xx = "This is a zmq test too"
    local xxx = "This is a zmq test too too"
    y = y + 1
    -- local ret = zassert(publisher:recv())
    -- print(y.."rep recv"..ret)
    sleep(1)
    zassert(publisher:send(x))
    zassert(publisher:send(xx))
    zassert(publisher:send(xxx))
    sleep(1)
    print(y..":"..x..xx..xx)
end

서브 엔 드
--------------------------SUB-------------------

SUB   PUB    , filter       
local filter =""
printf("Collecting updates from weather server ...
") local context = zmq.context() local subscriber, err = context:socket{zmq.SUB, -- subscribe = filter; -- connect = "tcp://172.15.2.4:6000"; connect = "tcp://*:7002"; } zassert(subscriber,err) print(subscriber) local update_nbr, total_temp = 100, 0 -- for i = 1, update_nbr do while(1) do print("~~~~~~~~~~~") local message = subscriber:recv() -- local y = {} -- y = string.split(message,%s) -- print(y..":"..#y) local x = "" local table1 = {} for name1 in string.gmatch(message,"([%d]*)%s+([-]?[%d-]*)%s+([-]?[%d-]*)") do table.insert(table1.name1) print(name1) end for i=1,7 do -- x = x..table1[i].."," print(i) print(table1[i]) end -- for name2 in string.gmatch(message,"title_name %w+") do -- print(name2) -- x = x..","..name2 -- end print(x) print(total_temp.."-> "..message) total_temp = total_temp + 1 end

3.lua 의 socket 통신,사례 에서 메 시 지 를 보 내 고 받 아들 일 수 있 을 뿐 답장 설정 이 없 으 며 코드 가 후속 적 으로 완선 되 었 습 니 다.  socket 은 IP 주소,포트 번 호 를 연결 하여 두 기계 간 의 통신 과정 을 실현 합 니 다.   서버 서버:
    -- server.lua
local socket = require("socket")

-- local host = "127.0.0.1"
local host = "192.168.0.100"
local port = "12346"
local server = assert(socket.bind(host, port, 1024))
server:settimeout(0)
local client_tab = {}
local conn_count = 0

print("Server Start " .. host .. ":" .. port) 

while 1 do
    local conn = server:accept()
    if conn then
        conn_count = conn_count + 1
        client_tab[conn_count] = conn
        print("A client successfully connect!") 
    end

    for conn_count, client in pairs(client_tab) do
        local recvt, sendt, status = socket.select({client}, nil, 1)
        if #recvt > 0 then
            local receive, receive_status = client:receive()
            if receive_status ~= "closed" then
                if receive then
                    assert(client:send("Client " .. conn_count .. " Send : "))
                    assert(client:send(receive .. "
")) print("Receive Client " .. conn_count .. " : ", receive) end else table.remove(client_tab, conn_count) client:close() print("Client " .. conn_count .. " disconnect!") end end end end

클 라 이언 트 클 라 이언 트:  – client.lua
local socket = require("socket")

local host = "192.168.0.100"
local port = "12346"
local sock = assert(socket.connect(host, port))
sock:settimeout(0)

print("Press enter after input something:")

local input, recvt, sendt, status
while true do
    input = io.read()
    if #input > 0 then
        assert(sock:send(input .. "
")) end recvt, sendt, status = socket.select({sock}, nil, 1) while #recvt > 0 do local response, receive_status = sock:receive() if receive_status ~= "closed" then if response then print(response) recvt, sendt, status = socket.select({sock}, nil, 1) end else break end end end

좋은 웹페이지 즐겨찾기