From d100fefd8d27cb34e216c22dc1af186ecb1ad80f Mon Sep 17 00:00:00 2001 From: partic Date: Mon, 22 Nov 2021 11:45:54 +0800 Subject: [PATCH] avoid to convert session to int, add string<->bytes auto convert --- java/src/pursuer/pxprpc/AbstractCallable.java | 7 +++++ java/src/pursuer/pxprpc/ServerContext.java | 38 +++++++++++++++------------ java/src/pursuer/test/PxpRpc.java | 7 +++++ 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/java/src/pursuer/pxprpc/AbstractCallable.java b/java/src/pursuer/pxprpc/AbstractCallable.java index 19318d2..24e13ae 100644 --- a/java/src/pursuer/pxprpc/AbstractCallable.java +++ b/java/src/pursuer/pxprpc/AbstractCallable.java @@ -63,6 +63,9 @@ public abstract class AbstractCallable implements PxpCallable{ return 8; } }else{ + if(jtype.equals(String.class)) { + return 9; + } return 8; } } @@ -95,6 +98,9 @@ public abstract class AbstractCallable implements PxpCallable{ case 8: int addr=readInt32(); return ctx.refSlots.get(addr); + case 9: + //string type + return readNextString(); default : throw new UnsupportedOperationException(); } @@ -133,6 +139,7 @@ public abstract class AbstractCallable implements PxpCallable{ break; //reference type case 8: + case 9: ctx.writeInt32(addrIfRefType); break; default : diff --git a/java/src/pursuer/pxprpc/ServerContext.java b/java/src/pursuer/pxprpc/ServerContext.java index 4c3659f..e1af540 100644 --- a/java/src/pursuer/pxprpc/ServerContext.java +++ b/java/src/pursuer/pxprpc/ServerContext.java @@ -8,6 +8,7 @@ import java.lang.reflect.Method; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; @@ -29,9 +30,9 @@ public class ServerContext implements Closeable{ } public void serve() throws IOException { while(running) { - int oper=readInt32(); - int opcode=oper&0xff; - int session=oper; + byte[] session=new byte[4]; + this.in.read(session); + int opcode=session[0]; switch(opcode) { case 1: push(session); @@ -60,22 +61,22 @@ public class ServerContext implements Closeable{ running=false; } - public void push(final int session) throws IOException { + public void push(final byte[] session) throws IOException { int addr=readInt32(); int len=readInt32(); byte[] buf=new byte[len]; in.read(buf); refSlots.put(addr,buf); writeLock().lock(); - writeInt32(session); + this.out.write(session); writeLock().unlock(); out.flush(); } - public void pull(final int session) throws IOException { + public void pull(final byte[] session) throws IOException { int addr=readInt32(); Object o=refSlots.get(addr); writeLock().lock(); - writeInt32(session); + this.out.write(session); if(o instanceof byte[]) { byte[] b=(byte[]) o; writeInt32(b.length); @@ -90,23 +91,24 @@ public class ServerContext implements Closeable{ writeLock().unlock(); out.flush(); } - public void assign(final int session) throws IOException { + public void assign(final byte[] session) throws IOException { int addr=readInt32(); int srcAddr=readInt32(); refSlots.put(addr, refSlots.get(srcAddr)); writeLock().lock(); - writeInt32(session); + this.out.write(session); writeLock().unlock(); + out.flush(); } - public void unlink(final int session) throws IOException { + public void unlink(final byte[] session) throws IOException { int addr=readInt32(); refSlots.remove(addr); writeLock().lock(); - writeInt32(session); + this.out.write(session); writeLock().unlock(); out.flush(); } - public void call(final int session) throws IOException { + public void call(final byte[] session) throws IOException { final int retAddr=readInt32(); int funcAddr=readInt32(); final PxpCallable callable=(PxpCallable) refSlots.get(funcAddr); @@ -117,7 +119,7 @@ public class ServerContext implements Closeable{ try { refSlots.put(retAddr, result); writeLock().lock(); - writeInt32(session); + ServerContext.this.out.write(session); callable.writeResult(result, retAddr); writeLock().unlock(); out.flush(); @@ -126,7 +128,7 @@ public class ServerContext implements Closeable{ } }); } - public void getFunc(final int session) throws IOException { + public void getFunc(final byte[] session) throws IOException { int retAddr=readInt32(); String name=this.readNextString(); int namespaceDelim=name.indexOf("."); @@ -136,11 +138,11 @@ public class ServerContext implements Closeable{ Method found=builtIn.getMethod(obj, func); writeLock().lock(); if(found==null) { - writeInt32(session); + this.out.write(session); writeInt32(0); }else { refSlots.put(retAddr, new BoundMethodCallable(found, obj)); - writeInt32(session); + this.out.write(session); writeInt32(retAddr); } writeLock().unlock(); @@ -168,11 +170,13 @@ public class ServerContext implements Closeable{ int addr=readInt32(); return (byte[])refSlots.get(addr); } + public static final Charset charset=Charset.forName("utf-8"); + public String readNextString() throws IOException { int addr=readInt32(); Object o=refSlots.get(addr); if(o instanceof byte[]) { - return new String((byte[])o,"utf-8"); + return new String((byte[])o,charset); }else { return o.toString(); } diff --git a/java/src/pursuer/test/PxpRpc.java b/java/src/pursuer/test/PxpRpc.java index 5847857..6c9f008 100644 --- a/java/src/pursuer/test/PxpRpc.java +++ b/java/src/pursuer/test/PxpRpc.java @@ -104,6 +104,7 @@ public class PxpRpc { // set *1101 = getFunc test1.print5678 client.getFunc(1101,"test1.print5678"); // set *1102 = call *1101 + System.out.println("expect print 5678"); client.callIntFunc(1102, 1101, new Object[0]); //set *1101 = getFunc test1.get1234 client.getFunc(1101, "test1.get1234"); @@ -113,6 +114,12 @@ public class PxpRpc { client.getFunc(1103, "test1.printString"); //set *1104 = call *1103 (*1102) //currently, 1102 slot store the value return by test1.get1234 + System.out.println("expect print 1234"); + client.callIntFunc(1104,1103,new Object[] {1102}); + //set *1102="pxprpc" + client.push(1102, "pxprpc".getBytes("utf-8")); + //should print pxprpc + System.out.println("expect print pxprpc"); client.callIntFunc(1104,1103,new Object[] {1102}); System.out.println("sleep 1 tick"); -- 2.11.4.GIT