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 + -
显示快捷键?