✨ update test/jsonrpc.nas
This commit is contained in:
parent
73450092f2
commit
4e17de909a
11
stl/json.nas
11
stl/json.nas
|
@ -66,7 +66,8 @@ var JSON=func() {
|
||||||
var get=func(str) {
|
var get=func(str) {
|
||||||
init();
|
init();
|
||||||
if(!size(str)) {
|
if(!size(str)) {
|
||||||
die("empty string");
|
println("JSON.parse: empty string");
|
||||||
|
str="[]";
|
||||||
}
|
}
|
||||||
text=str;
|
text=str;
|
||||||
text_size=size(text);
|
text_size=size(text);
|
||||||
|
@ -145,7 +146,7 @@ var JSON=func() {
|
||||||
|
|
||||||
var match=func(type) {
|
var match=func(type) {
|
||||||
if(token.type!=type)
|
if(token.type!=type)
|
||||||
print("line ",line,": expect ",j_content[type]," but get `",token.content,"`.\n");
|
println("JSON.parse: line ",line,": expect ",j_content[type]," but get `",token.content,"`.");
|
||||||
next();
|
next();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -213,7 +214,8 @@ var JSON=func() {
|
||||||
return {
|
return {
|
||||||
parse:func(str) {
|
parse:func(str) {
|
||||||
if(typeof(str)!="str") {
|
if(typeof(str)!="str") {
|
||||||
die("JSON.parse: must use string");
|
println("JSON.parse: must use string");
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
get(str);
|
get(str);
|
||||||
next();
|
next();
|
||||||
|
@ -232,7 +234,8 @@ var JSON=func() {
|
||||||
|
|
||||||
JSON.stringify=func(object) {
|
JSON.stringify=func(object) {
|
||||||
if(typeof(object)!="hash" and typeof(object)!="vec") {
|
if(typeof(object)!="hash" and typeof(object)!="vec") {
|
||||||
die("JSON.stringify: must use hashmap or vector");
|
println("JSON.stringify: must use hashmap or vector");
|
||||||
|
return "[]";
|
||||||
}
|
}
|
||||||
|
|
||||||
var s="";
|
var s="";
|
||||||
|
|
109
test/jsonrpc.nas
109
test/jsonrpc.nas
|
@ -1,80 +1,133 @@
|
||||||
import.module.libsock;
|
import.module.libsock;
|
||||||
import.stl.json;
|
import.stl.json;
|
||||||
|
|
||||||
var jsonrpc=func(){
|
var gettime=func(){
|
||||||
|
return split(" ",os.time())[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
var jsonRPC=func(){
|
||||||
var sd=nil;
|
var sd=nil;
|
||||||
return {
|
return {
|
||||||
establish:func(ip,port) {
|
establish:func(ip,port) {
|
||||||
sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
||||||
if(socket.bind(sd,ip,port)<0) {
|
if(socket.bind(sd,ip,port)<0) {
|
||||||
println("failed to bind socket "~sd~" at "~ip~":"~port~".");
|
println("[",gettime(),"] failed to bind socket ",sd," at ",ip,":",port);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
socket.listen(sd,1);
|
socket.listen(sd,1);
|
||||||
println("[",os.time(),"] start connection at [",ip,":",port,"]");
|
println("[",gettime(),"] start connection at [",ip,":",port,"]");
|
||||||
return 1;
|
return 1;
|
||||||
},
|
},
|
||||||
connect:func(ip,port) {
|
connect:func(ip,port) {
|
||||||
sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
||||||
while(socket.connect(sd,ip,port)<0) {
|
while(socket.connect(sd,ip,port)<0) {
|
||||||
println("[",os.time(),"] failed to connect socket "~sd~" to "~ip~":"~port~", retrying.");
|
println("[",gettime(),"] failed to connect socket ",sd," to ",ip,":",port);
|
||||||
unix.sleep(1);
|
unix.sleep(5);
|
||||||
}
|
}
|
||||||
println("[",os.time(),"] start connection at [",ip,":",port,"]");
|
println("[",gettime(),"] start connection at [",ip,":",port,"]");
|
||||||
return {ip:ip,sd:sd}; # get server ip and sd
|
return {ip:ip,sd:sd}; # get server ip and sd
|
||||||
},
|
},
|
||||||
shutdown:func() {
|
shutdown:func() {
|
||||||
println("[",os.time(),"] shutdown");
|
println("[",gettime(),"] shutdown");
|
||||||
socket.closesocket(sd);
|
socket.closesocket(sd);
|
||||||
},
|
},
|
||||||
accept:func() {
|
accept:func() {
|
||||||
|
println("[",gettime(),"] accpet sd ",sd);
|
||||||
return socket.accept(sd);
|
return socket.accept(sd);
|
||||||
},
|
},
|
||||||
disconnect:func(client) {
|
disconnect:func(client) {
|
||||||
println("[",os.time(),"] [",client.ip,"] disconnected");
|
println("[",gettime(),"] disconnected");
|
||||||
return socket.closesocket(client.sd);
|
return socket.closesocket(client.sd);
|
||||||
},
|
},
|
||||||
recv:func(client){
|
recv:func(client){
|
||||||
var data=socket.recv(client.sd,2048);
|
var data=socket.recv(client.sd,2048);
|
||||||
if(data.size<=0){
|
if(data.size<=0){
|
||||||
println("[",os.time(),"] [",client.ip,"] closed connection");
|
println("[",gettime(),"] closed connection, recv failed");
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
println("[",os.time(),"] [",client.ip,"] receive ",data.str);
|
println("[",gettime(),"] receive ",data.str);
|
||||||
return data.str;
|
return data.str;
|
||||||
},
|
},
|
||||||
send:func(client,content){
|
send:func(client,content){
|
||||||
println("[",os.time(),"] [",client.ip,"] sending ",content);
|
println("[",gettime(),"] sending ",content);
|
||||||
return socket.send(client.sd,content);
|
return socket.send(client.sd,content);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}();
|
}();
|
||||||
|
|
||||||
var id=1;
|
var server=func(ip,port) {
|
||||||
var args=runtime.argv();
|
var methods={
|
||||||
if (size(args)!=0) {
|
callHello:func(vec) {
|
||||||
if (args[0]=="--server") {
|
var res="hello ";
|
||||||
jsonrpc.establish("127.0.0.1",8080);
|
foreach(var i;vec) {
|
||||||
var client=jsonrpc.accept();
|
res~=i~" ";
|
||||||
jsonrpc.send(client, JSON.stringify({jsonrpc:2.0, id:1, result:{info:"from server: first info"}}));
|
}
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
onRandom:func(vec) {
|
||||||
|
return "rand: "~str(rand());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jsonRPC.establish(ip,port);
|
||||||
while(1) {
|
while(1) {
|
||||||
var data=jsonrpc.recv(client);
|
var client=jsonRPC.accept();
|
||||||
|
while(1) {
|
||||||
|
var data=jsonRPC.recv(client);
|
||||||
if (data!=nil) {
|
if (data!=nil) {
|
||||||
data=JSON.parse(data);
|
data=JSON.parse(data);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
jsonrpc.send(client, JSON.stringify({jsonrpc:2.0, id:data.id+1, result:{info:"from server"}}));
|
if (contains(methods,data.method)) {
|
||||||
|
jsonRPC.send(client, JSON.stringify({
|
||||||
|
jsonrpc:2.0,
|
||||||
|
id:data.id,
|
||||||
|
error:"null",
|
||||||
|
result:methods[data.method](data.params)
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
jsonRPC.send(client, JSON.stringify({
|
||||||
|
jsonrpc:2.0,
|
||||||
|
id:data.id,
|
||||||
|
error:"no such method \\\""~data.method~"\\\"",
|
||||||
|
result:"null"
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
jsonrpc.disconnect(client);
|
|
||||||
} elsif (args[0]=="--client") {
|
}
|
||||||
var server=jsonrpc.connect("127.0.0.1",8080);
|
}
|
||||||
|
jsonRPC.disconnect(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
var client=func(ip,port) {
|
||||||
|
srand();
|
||||||
|
var call_id=1;
|
||||||
|
var methods=["callHello","notExist","onRandom"];
|
||||||
|
var params=[["a","b"],["1","2"]];
|
||||||
|
|
||||||
|
var server=jsonRPC.connect(ip,port);
|
||||||
while(1) {
|
while(1) {
|
||||||
unix.sleep(1);
|
unix.sleep(5);
|
||||||
var respond=JSON.parse(jsonrpc.recv(server));
|
var data=JSON.stringify({jsonrpc:2.0, id:call_id, method:methods[rand()*size(methods)],params:params[rand()*size(params)]});
|
||||||
var data=JSON.stringify({jsonrpc:2.0, id:respond.id+1, result:{info:"from client"}});
|
jsonRPC.send(server, data);
|
||||||
jsonrpc.send(server, data);
|
var respond=jsonRPC.recv(server);
|
||||||
|
if (respond==nil) {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
jsonrpc.disconnect(server);
|
println("[",gettime(),"] result: ",JSON.parse(respond).result);
|
||||||
|
call_id+=1;
|
||||||
|
}
|
||||||
|
jsonRPC.disconnect(server);
|
||||||
|
}
|
||||||
|
|
||||||
|
func() {
|
||||||
|
var args=runtime.argv();
|
||||||
|
if (size(args)!=0) {
|
||||||
|
if (args[0]=="--server") {
|
||||||
|
server("127.0.0.1",5007);
|
||||||
|
} elsif (args[0]=="--client") {
|
||||||
|
client("127.0.0.1",5007);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}();
|
Loading…
Reference in New Issue