datamarshalserverimpl.java
来自「SRI international 发布的OAA框架软件」· Java 代码 · 共 136 行
JAVA
136 行
/* $Id: DataMarshalServerImpl.java,v 1.5 2003/09/29 16:54:58 giuli Exp $*/
/**************************************************************************
* Copyright 2002, 2003 SRI International. All rights reserved.
*
* The material contained in this file is confidential and proprietary to SRI
* International and may not be reproduced, published, or disclosed to others
* without authorization from SRI International.
*
* DISCLAIMER OF WARRANTIES
*
* SRI International MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SRI International SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THIS SOFTWARE
**************************************************************************/
package com.sri.sedc.javanetbridge.io;
import com.sri.sedc.javanetbridge.JavaNetBridgeBeanImpl;
import com.sri.oaa2.lib.LibOaa;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Map;
/**
* Default implementation of InvocationHandlerServer.
*/
class DataMarshalServerImpl implements InvocationHandlerServer {
private int listenPort;
private JavaNetBridgeBeanCreator creator;
private Map beans = new Hashtable();
private Map beansReverseMap = new Hashtable();
private Map beanRefCounts = new Hashtable();
private int beanIndx = 0;
DataMarshalServerImpl(int listenPort, JavaNetBridgeBeanCreator creator) {
this.listenPort = listenPort;
this.creator = creator;
}
protected void notifyDisconnect(JavaNetBridgeBeanImpl bean) {
int refCount = 0;
synchronized (beanRefCounts) {
refCount = ((Number)beanRefCounts.get(bean)).intValue();
beanRefCounts.put(bean, new Integer(refCount-1));
}
if (refCount == 1) {
int id = ((Integer)beansReverseMap.get(bean)).intValue();
System.out.println("No more connections, destroying bean " + id);
beanRefCounts.remove(bean);
beans.remove(bean);
beansReverseMap.remove(new Integer(id));
bean.destroy();
}
}
public void runServer() throws Exception {
ServerSocket server = new ServerSocket(listenPort);
while (true) {
Socket client = server.accept();
boolean gotCmd = false;
try {
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
DataMarshalInputStream din = JavaNetBridgeIOFactory.getFactory().newDataMarshalInputStream(in);
DataMarshalOutputStream dout = JavaNetBridgeIOFactory.getFactory().newDataMarshalOutputStream(out);
String idstr = din.readString();
if (idstr.equals("New")) {
System.out.println("ERROR: The connecting host from " + client.getInetAddress());
System.out.println("ERROR: is using a Oaa2JavaNet.dll compiled from a different");
System.out.println("ERROR: version of OAA. Please update the dll on the calling");
System.out.println("ERROR: application.");
client.close();
}
String datestr = din.readString();
String cmd = din.readString();
gotCmd = true;
JavaNetBridgeBeanImpl bean = null;
if (cmd.equals("New")) {
System.out.println("Accepted new client connection from " + client.getInetAddress());
bean = creator.newJavaNetBridgeBeanImpl();
dout.write(beanIndx);
dout.flush();
beans.put(new Integer(beanIndx), bean);
beansReverseMap.put(bean, new Integer(beanIndx));
beanRefCounts.put(bean, new Integer(0));
//System.out.println("Created bean " + beanIndx + ", bean class = " + bean.getClass().getName());
beanIndx++;
InvocationRunnable runnable = new InvocationRunnable(client, din, dout, bean, this);
new Thread(runnable).start();
if (!bean.getIDString().equals(idstr)) {
StringBuffer err = new StringBuffer();
err.append("\nWARNING: The connecting host from " + client.getInetAddress() + "\n");
err.append("WARNING: is using a Oaa2JavaNet.dll compiled from a different\n");
err.append("WARNING: version of OAA. This id = " + bean.getIDString() +", and the\n");
err.append("WARNING: connecting id is " + idstr + ".\n");
err.append("WARNING: This proxy was generated on " + bean.getDateString() + ", and the\n");
err.append("WARNING: connecting app is using a dll generated on " + datestr + "\n");
err.append("WARNING: The proxy may work, but the dll and proxy used should be from\n");
err.append("WARNING: the same OAA version. This OAA version = " + LibOaa.getLibraryVersion() + "\n");
System.out.println(err.toString());
}
} else if (cmd.equals("AttachCallback")) {
int id = din.readInt();
bean = (JavaNetBridgeBeanImpl)beans.get(new Integer(id));
synchronized (beanRefCounts) {
int refCount = ((Number)beanRefCounts.get(bean)).intValue();
beanRefCounts.put(bean, new Integer(refCount+1));
}
SocketCallbackListener listener = new SocketCallbackListener(client, din, dout, bean, this);
bean.addCallbackEventListener(listener);
}
} catch (Throwable ex) {
// Only print if a real error occurred. Sometimes a dotnet app will connect
// just to make sure the dotnetproxy is running but not send any data...
if (gotCmd) {
ex.printStackTrace();
}
try {
client.close();
} catch (Throwable err) {
// Ignore
}
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?