update test/jsonrpc.nas

This commit is contained in:
ValKmjolnir 2023-03-25 21:26:49 +08:00
parent 73450092f2
commit 4e17de909a
2 changed files with 91 additions and 35 deletions

View File

@ -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="";

View File

@ -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);
} }
} }
}();