InterfaceServer.java:
(The following program and the program on the next slide serve as examples for you to study and to develop your own components. Do not use this Interface Server as the SIS Server because you can download and install the most up-to-date SIS server, Java components and Android components following the system installation procedure.)/*
Communication Interface for Virtual Classroom Components.
Complied in JDK 1.4.2
Usage:
Step1: Create your component which implemnts Interface
ComponentBase.
Step2: Replace the ComponentMy with your class name in
InterfaceServer::main().
Step3: start up Interface Server by
java InterfaceServer
Step4: Use Virtual remote which is also provided on the
web to send message and get the feedback message.
*/
import java.io.*;
import java.net.*;
import java.util.*;
/*
Class KeyValueList:
List of (Key, Value) pair--the basic format of message
Keys: MsgID and Description are required for any messages
MsgID 0-999 is reserved for system use.
You MsgID could start from 1000.
*/
class KeyValueList{
private Vector Keys;
private Vector Values;
/* Constructor */
public KeyValueList(){
Keys=new Vector();
Values=new Vector();
}
/* Look up the value given key, used in getValue() */
private int lookupKey(String strKey){
for(int i=0;i<Keys.size();i++){
String k=(String) Keys.elementAt(i);
if (strKey.equals(k)) return i;
}
return -1;
}
/* add new (key,value) pair to list */
public boolean addPair(String strKey,String strValue){
return (Keys.add(strKey)&& Values.add(strValue));
}
/* get the value given key */
public String getValue(String strKey){
int index=lookupKey(strKey);
if (index==-1) return null;
return (String) Values.elementAt(index);
}
/* Show whole list */
public String toString(){
String result = new String();
for(int i=0;i<Keys.size();i++){
result+=(String) Keys.elementAt(i)+":"+(String) Values.elementAt(i)+"\n";
}
return result;
}
public int size(){ return Keys.size(); }
/* get Key or Value by index */
public String keyAt(int index){ return (String) Keys.elementAt(index);}
public String valueAt(int index){ return (String) Values.elementAt(index);}
}
/*
Class MsgEncoder:
Serialize the KeyValue List and Send it out to a Stream.
*/
class MsgEncoder{
private PrintStream printOut;
/* Default of delimiter in system is $$$ */
private final String delimiter="$$$";
public MsgEncoder(){
}
/* Encode the Key Value List into a string and Send it
out */
public void sendMsg(KeyValueList kvList, OutputStream out) throws IOException{
PrintStream printOut= new PrintStream(out);
if (kvList==null) return;
String outMsg= new String();
for(int i=0; i<kvList.size();i++){
if (outMsg.equals(""))
outMsg=kvList.keyAt(i)+delimiter + kvList.valueAt(i);
else
outMsg+=delimiter+kvList.keyAt(i)+delimiter + kvList.valueAt(i);
}
//System.out.println(outMsg);
printOut.println(outMsg);
}
}
/*
Class MsgDecoder:
Get String from input Stream and reconstruct it to
a Key Value List.
*/
class MsgDecoder {
private BufferedReader bufferIn;
private final String delimiter="$$$";
public MsgDecoder(InputStream in){
bufferIn = new BufferedReader(new InputStreamReader(in));
}
/*
get String and output KeyValueList
*/
public KeyValueList getMsg() throws IOException{
String strMsg= bufferIn.readLine();
if (strMsg==null) return null;
KeyValueList kvList = new KeyValueList();
StringTokenizer st = new StringTokenizer(strMsg,delimiter);
while (st.hasMoreTokens()) {
kvList.addPair(st.nextToken(),st.nextToken());
}
return kvList;
}
}
/*
interface ComponentBase:
The interface you have to implement in your component
*/
interface ComponentBase{
public KeyValueList processMsg(KeyValueList kvList);
}
/*
Class InterfaceServer
Set up a socket server waiting for the remote to connect.
*/
public class InterfaceServer
{
public static final int port=7999;
public static void main(String[] args) throws Exception
{
ServerSocket server = new ServerSocket(port);
/*
You need to create your component here
*/
ComponentBase compMy= new componentMy();
Socket client = server.accept();
try{
MsgDecoder mDecoder= new
MsgDecoder(client.getInputStream());
MsgEncoder mEncoder= new MsgEncoder();
KeyValueList kvInput,kvOutput;
do
{
kvInput=mDecoder.getMsg();
if (kvInput!=null) {
System.out.println("Incomming
Message:\n");
System.out.println(kvInput);
KeyValueList kvResult=compMy.processMsg(kvInput);
System.out.println("Outgoing
Message:\n");
System.out.println(kvResult);
mEncoder.sendMsg(kvResult,client.getOutputStream());
}
}
while (kvInput!=null);
}
catch (SocketException e){
System.out.println("Connection was Closed by Client");
}
}
}