mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			232 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* UnicastConnection.java --
 | |
|    Copyright (c) 1996, 1997, 1998, 1999, 2002, 2004
 | |
|    Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package gnu.java.rmi.server;
 | |
| 
 | |
| import java.io.BufferedInputStream;
 | |
| import java.io.BufferedOutputStream;
 | |
| import java.io.DataInputStream;
 | |
| import java.io.DataOutputStream;
 | |
| import java.io.IOException;
 | |
| import java.io.ObjectInputStream;
 | |
| import java.io.ObjectOutputStream;
 | |
| import java.net.Socket;
 | |
| import java.rmi.RemoteException;
 | |
| 
 | |
| public class UnicastConnection
 | |
|         implements Runnable, ProtocolConstants {
 | |
| 
 | |
| UnicastConnectionManager manager;
 | |
| Socket sock;
 | |
| DataInputStream din;
 | |
| DataOutputStream dout;
 | |
| ObjectInputStream oin;
 | |
| ObjectOutputStream oout;
 | |
| 
 | |
| // reviveTime and expireTime make UnicastConnection pool-able
 | |
| long reviveTime = 0;
 | |
| long expireTime = Long.MAX_VALUE;
 | |
| 
 | |
| UnicastConnection(UnicastConnectionManager man, Socket sock) {
 | |
|         this.manager = man;
 | |
|         this.sock = sock;
 | |
| }
 | |
| 
 | |
| void acceptConnection() throws IOException {
 | |
| //System.out.println("Accepting connection on " + sock);
 | |
|     //Use BufferedXXXStream would be more efficient
 | |
|         din = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
 | |
|         dout = new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
 | |
| 
 | |
|         int sig = din.readInt();
 | |
|         if (sig != PROTOCOL_HEADER) {
 | |
|                 throw new IOException("bad protocol header");
 | |
|         }
 | |
|         short ver = din.readShort();
 | |
|         if (ver != PROTOCOL_VERSION) {
 | |
|                 throw new IOException("bad protocol version");
 | |
|         }
 | |
|         int protocol = din.readUnsignedByte();
 | |
|         if (protocol != SINGLE_OP_PROTOCOL) {
 | |
|                 // Send an ACK
 | |
|                 dout.writeByte(PROTOCOL_ACK);
 | |
| 
 | |
|                 // Send my hostname and port
 | |
|                 dout.writeUTF(manager.serverName);
 | |
|                 dout.writeInt(manager.serverPort);
 | |
|                 dout.flush();
 | |
| 
 | |
|                 // Read their hostname and port
 | |
|                 String rhost = din.readUTF();
 | |
|                 int rport = din.readInt();
 | |
|         }
 | |
|         // Okay, ready to roll ...
 | |
| }
 | |
| 
 | |
| void makeConnection(int protocol) throws IOException {
 | |
|     //Use BufferedXXXStream would be more efficient
 | |
|         din = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
 | |
| 
 | |
|         dout = new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
 | |
| 
 | |
|         // Send header
 | |
|         dout.writeInt(PROTOCOL_HEADER);
 | |
|         dout.writeShort(PROTOCOL_VERSION);
 | |
|         dout.writeByte(protocol);
 | |
|     dout.flush();
 | |
| 
 | |
|         if (protocol != SINGLE_OP_PROTOCOL) {
 | |
|                 // Get back ack.
 | |
|                 int ack = din.readUnsignedByte();
 | |
|                 if (ack != PROTOCOL_ACK) {
 | |
|                         throw new RemoteException("Unsupported protocol");
 | |
|                 }
 | |
| 
 | |
|                 // Read in host and port
 | |
|                 String dicard_rhost = din.readUTF();
 | |
|                 int discard_rport = din.readInt();
 | |
| 
 | |
|                 // Send them my endpoint
 | |
|                 dout.writeUTF(manager.serverName);
 | |
|                 dout.writeInt(manager.serverPort);
 | |
|                 dout.flush();
 | |
|         }
 | |
|         // Okay, ready to roll ...
 | |
| }
 | |
| 
 | |
| DataInputStream getDataInputStream() throws IOException {
 | |
|         return (din);
 | |
| }
 | |
| 
 | |
| DataOutputStream getDataOutputStream() throws IOException {
 | |
|         return (dout);
 | |
| }
 | |
| 
 | |
| /*
 | |
| *
 | |
| * get ObjectInputStream for reading more objects
 | |
| *
 | |
| */
 | |
| ObjectInputStream getObjectInputStream() throws IOException {
 | |
|         if (oin == null) {
 | |
|                 throw new IOException("no ObjectInputtream for reading more objects");
 | |
|         }
 | |
|         return (oin);
 | |
| }
 | |
| 
 | |
| /**
 | |
| *
 | |
| * starts ObjectInputStream.
 | |
| *
 | |
| */
 | |
| ObjectInputStream startObjectInputStream() throws IOException {
 | |
|         return (oin = new RMIObjectInputStream(din));
 | |
| }
 | |
| 
 | |
| /**
 | |
| *
 | |
| * get ObjectOutputStream for sending more objects
 | |
| *
 | |
| */
 | |
| ObjectOutputStream getObjectOutputStream() throws IOException {
 | |
|         if (oout == null) {
 | |
|                 throw new IOException("no ObjectOutputStream for sending more objects");
 | |
|         }
 | |
|         return (oout);
 | |
| }
 | |
| 
 | |
| /**
 | |
| *
 | |
| * starts ObjectOutputStream.
 | |
| *
 | |
| */
 | |
| ObjectOutputStream startObjectOutputStream() throws IOException {
 | |
|         return (oout = new RMIObjectOutputStream(dout));
 | |
| }
 | |
| 
 | |
| void disconnect() {
 | |
|         try {
 | |
|             if(oout != null)
 | |
|                 oout.close();
 | |
|         sock.close();
 | |
|         }
 | |
|         catch (IOException _) {
 | |
|     }
 | |
| 
 | |
|         oin = null;
 | |
|     oout = null;
 | |
|         din = null;
 | |
|         dout = null;
 | |
|         sock = null;
 | |
| }
 | |
| 
 | |
| public static final long CONNECTION_TIMEOUT = 10000L;
 | |
| 
 | |
| static boolean isExpired(UnicastConnection conn, long l){
 | |
|     if (l <= conn.expireTime )
 | |
|         return false;
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| static void resetTime(UnicastConnection conn){
 | |
|     long l = System.currentTimeMillis();
 | |
|     conn.reviveTime = l;
 | |
|     conn.expireTime = l + CONNECTION_TIMEOUT;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * We run connects on the server. Dispatch it then discard it.
 | |
|  */
 | |
| public void run() {
 | |
|     do{
 | |
|         try {
 | |
|                 UnicastServer.dispatch(this);
 | |
|             //don't discardConnection explicitly, only when
 | |
|             //  exception happens or the connection's expireTime
 | |
|             //  comes
 | |
|         } catch (Exception e ){
 | |
|                 manager.discardConnection(this);
 | |
|             break;
 | |
|         }
 | |
|     }while(true);
 | |
| }
 | |
| 
 | |
| 
 | |
| }
 |