package hprose.tcpsessionexam;
import hprose.common.HproseContext;
import hprose.common.HproseFilter;
import hprose.io.ByteBufferStream;
import hprose.server.HproseService;
import hprose.server.HproseTcpServer;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.IdentityHashMap;
public class TCPSessionServer {
static class Session {
final static IdentityHashMap<HproseContext, Integer> sidMap = new IdentityHashMap<HproseContext, Integer>();
final static ArrayList<HashMap<String, Object>> sessions = new ArrayList<HashMap<String, Object>>();
public static HashMap<String, Object> getSession(HproseContext context) {
return sessions.get(sidMap.get(context));
}
}
static class MyServerFilter implements HproseFilter {
@Override
public ByteBuffer inputFilter(ByteBuffer istream, HproseContext context) {
int len = istream.limit() - 7;
if (len > 0 &&
istream.get() == 's' &&
istream.get() == 'i' &&
istream.get() == 'd') {
int sid = ((int)istream.get()) << 24 |
((int)istream.get()) << 16 |
((int)istream.get()) << 8 |
(int)istream.get();
Session.sidMap.put(context, sid);
return istream.slice();
}
int sid = Session.sessions.size();
Session.sidMap.put(context, sid);
Session.sessions.add(new HashMap<String, Object>());
istream.rewind();
return istream;
}
@Override
public ByteBuffer outputFilter(ByteBuffer ostream, HproseContext context) {
int sid = Session.sidMap.get(context);
ByteBuffer buf = ByteBufferStream.allocate(ostream.remaining() + 7);
buf.put((byte)'s');
buf.put((byte)'i');
buf.put((byte)'d');
buf.put((byte)(sid >> 24 & 0xff));
buf.put((byte)(sid >> 16 & 0xff));
buf.put((byte)(sid >> 8 & 0xff));
buf.put((byte)(sid & 0xff));
buf.put(ostream);
ByteBufferStream.free(ostream);
return buf;
}
}
public static int inc() {
HashMap<String, Object> session = Session.getSession(HproseService.getCurrentContext());
if (!session.containsKey("n")) {
session.put("n", 0);
return 0;
}
int i = (Integer)session.get("n") + 1;
session.put("n", i);
return i;
}
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
HproseTcpServer server = new HproseTcpServer("tcp://localhost:4321");
server.setFilter(new MyServerFilter());
server.setDebugEnabled(true);
server.add("inc", TCPSessionServer.class);
server.start();
System.out.println("START");
System.in.read();
server.stop();
System.out.println("STOP");
}
}