⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketcontroller.java

📁 移动Agent编程工具Naplet
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
        private byte[] buf = new byte[256];        public ControlChannel()            throws IOException        {            server = new DatagramSocket( UDPPort );            client = new DatagramSocket();            // set UDP timeout value            client.setSoTimeout( Global.UDPTIMEOUT );        }        /**         * Send message to destination         * @param msg         * @param addr         * @param port         * @throws IOException         */        public void sendMessage( String msg, InetAddress addr, int port )            throws IOException        {            buf = new byte[msg.length()];            buf = msg.getBytes();            DatagramPacket packet = new DatagramPacket( buf, buf.length,                addr, port );            client.send( packet );        }        /**         * Receive a message from peer. Return a null when timout.         * The caller must retransmit the message when getting a null.         * @return         * @throws IOException         */        public String receiveMessage()            throws IOException        {            buf = new byte[256];            DatagramPacket packet = new DatagramPacket( buf, buf.length );            try            {                client.receive( packet );            }            catch ( SocketTimeoutException se )            {                log( "get a timeout" );                return null;            }            String received = new String( packet.getData() );            return received;        }        /**         * Message handler for message exchanged by UDP channel.         */        public void run()        {            while ( true )            {                try                {                    byte[] inbuf = new byte[256];                    DatagramPacket packet = new DatagramPacket( inbuf,                        inbuf.length );                    // keep reading message                    server.receive( packet );                    String in = new String( packet.getData(), 0,                                            packet.getLength() );                    InetAddress clientaddr = packet.getAddress();                    int clientport = packet.getPort();                    log( "get a request in control channel:" + in );                    if ( in == null )                    {                        // the other side has existed, so                        // close this half socket                        return;                    }                    StringTokenizer stringtokenizer                        = new StringTokenizer( in, ":" );                    String s1 = stringtokenizer.nextToken();                    if ( s1.equals( "SuspendMsg" ) )                    {                        log( "get a Suspend request in Control Thread" );                        // socketID                        String sockID = stringtokenizer.nextToken();                        NapletSocket nsocket                            = ( NapletSocket ) socketTable.get( sockID );                        if ( SocketController.GENKEY )                        { // key                            BigInteger pubKey                                = new BigInteger( stringtokenizer.nextToken() );                            if ( !pubKey.equals( nsocket.getPublicKey() ) )                            {                                log( "***suspend key not match with socket:"                                     + nsocket.getPublicKey() );                            }                        }                        String ack = Global.ACKMSG;                        if ( ( ( nsocket.getPriority()                                 == Global.HIGH_PRIORITY )                               && ( nsocket.getState()                                    == Global.SUSPEND_SENT ) )                             || ( nsocket.getState()                                  == Global.SUSPEND_ACK_RCD ) )                        {                            ack = Global.ACK_WAIT_MSG;                            nsocket.setDualMigration( true );                            log( "send an ack wait msg with state:" +                                 nsocket.getState() );                        }                        log( "msg:" + ack + ", before send ack,pri:" +                             nsocket.getPriority() +                             ",state:" + nsocket.getState() );                        nsocket.setState( Global.SUSPEND_SENT );                        nsocket.setSuspendACKSent( true );                        //sendMessage(ack, clientaddr, clientport);                        byte[] buf = new byte[ack.length()];                        buf = ack.getBytes();                        packet = new DatagramPacket( buf, buf.length,                            clientaddr, clientport );                        server.send( packet );                        if ( ack.equalsIgnoreCase( Global.ACKMSG ) )                        { // only do this when snd ack                            nsocket.suspendRemotly();                        }                    }                    else if ( s1.equals( "CloseMsg" ) )                    { // for gracefully close                        log( "get a close request in ControlTh" );                        // send back ackmsg                        String ack = Global.ACKMSG;                        byte[] buf = new byte[ack.length()];                        buf = ack.getBytes();                        packet = new DatagramPacket( buf, buf.length,                            clientaddr, clientport );                        server.send( packet );                        String sockID = stringtokenizer.nextToken();                        NapletSocket nsocket                            = ( NapletSocket ) socketTable.get( sockID );                        nsocket.closeRemotely();                    }                    else if ( s1.equalsIgnoreCase( "HalfResumeMsg" ) )                    {                        log( "get a haf resume msg" );                        // send back ack msg                        String ack = Global.ACKMSG;                        byte[] buf = new byte[ack.length()];                        buf = ack.getBytes();                        packet = new DatagramPacket( buf, buf.length,                            clientaddr, clientport );                        server.send( packet );                        String sockID = stringtokenizer.nextToken();                        NapletSocket nsocket                            = ( NapletSocket ) socketTable.get( sockID );                        synchronized ( nsocket )                        {                            nsocket.setState( Global.HALF_RESUMED );                            nsocket.setRemoteAddress( clientaddr );                            nsocket.notifyAll();                        }                    }                }                catch ( Exception e )                {                    e.printStackTrace();                }            } // end of while true        } // end of run    } //end of Class ControlChannel} // end of Class SocketController/** * A wrapper for Hashtable storing some control information for NapletSocket * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */class SocketTable{    private Hashtable socketTable = new Hashtable();    protected SocketTable()    {}    protected void put( String sid, Object socket )    {        socketTable.put( sid, socket );    }    protected void remove( String nid )    {        String key = nid.toString();        socketTable.remove( key );    }    protected Object get( String nid )    {        String key = nid.toString();        return socketTable.get( key );    }    protected Enumeration getKeys()    {        return socketTable.keys();    }    protected boolean containsKey( Object key )    {        return socketTable.containsKey( key );    }    public String toString()    {        return socketTable.toString();    }    public Hashtable getTable()    {        return socketTable;    }} // end of Class SocketTableclass SampleAction    implements PrivilegedAction{    /**     * <p> This Sample PrivilegedAction performs the following operations:     * <ul>     * <li> Access the System property, <i>java.home</i>     * <li> Access the System property, <i>user.home</i>     * <li> Access the file, <i>foo.txt</i>     * </ul>     *     * @return <code>null</code> in all cases.     *     * @exception SecurityException if the caller does not have permission     *		to perform the operations listed above.     */    public Object run()    {        /// Here I do some security check for demostration. A better way is to        /// setup serversocket/socket here and return a reference.        AccessController.checkPermission( new java.net.SocketPermission(            "localhost",            "connect" ) );        try        {            ServerSocket ss = new ServerSocket( 7011 );        }        catch ( java.net.BindException be )        {        }        catch ( IOException ex )        {            ex.printStackTrace();        }        System.out.println( "pass security check" );        return null;    }} // end of class SampleActionclass SamplePrincipal    implements Principal, java.io.Serializable{    /**     * @serial     */    private String name;    /**     * Create a SamplePrincipal with a Sample username.     *     * <p>     *     * @param name the Sample username for this user.     *     * @exception NullPointerException if the <code>name</code>     *			is <code>null</code>.     */    public SamplePrincipal( String name )    {        if ( name == null )        {            throw new NullPointerException( "illegal null input" );        }        this.name = name;    }    /**     * Return the Sample username for this <code>SamplePrincipal</code>.     *     * <p>     *     * @return the Sample username for this <code>SamplePrincipal</code>     */    public String getName()    {        return name;    }    /**     * Return a string representation of this <code>SamplePrincipal</code>.     *     * <p>     *     * @return a string representation of this <code>SamplePrincipal</code>.     */    public String toString()    {        return ( "SamplePrincipal:  " + name );    }    /**     * Compares the specified Object with this <code>SamplePrincipal</code>     * for equality.  Returns true if the given object is also a     * <code>SamplePrincipal</code> and the two SamplePrincipals     * have the same username.     *     * <p>     *     * @param o Object to be compared for equality with this     *		<code>SamplePrincipal</code>.     *     * @return true if the specified Object is equal equal to this     *		<code>SamplePrincipal</code>.     */    public boolean equals( Object o )    {        if ( o == null )        {            return false;        }        if ( this == o )        {            return true;        }        if ( ! ( o instanceof SamplePrincipal ) )        {            return false;        }        SamplePrincipal that = ( SamplePrincipal ) o;        if ( this.getName().equals( that.getName() ) )        {            return true;        }        return false;    }    /**     * Return a hash code for this <code>SamplePrincipal</code>.     *     * <p>     *     * @return a hash code for this <code>SamplePrincipal</code>.     */    public int hashCode()    {        return name.hashCode();    }} // end of class SamplePrincipal

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -