Java程序辅导

C C++ Java Python Processing编程在线培训 程序编写 软件开发 视频讲解

客服在线QQ:2653320439 微信:ittutor Email:itutor@qq.com
wx: cjtutor
QQ: 2653320439
SocketWrapper.java in trunk/packages/sipb-xen-vnc-client/code – xvm Please file new bugs on Launchpad: Invirt or XVM (if you're not sure which, just pick one) Search: Login Help/Guide About Trac Preferences Wiki Timeline Roadmap Browse Source View Tickets Search Context Navigation ← Previous Revision Latest Revision Next Revision → Blame Revision Log source: trunk/packages/sipb-xen-vnc-client/code/SocketWrapper.java @ 319 View diff against: View revision: Visit: trunkbranches/wsgi Last change on this file since 319 was 233, checked in by ecprice, 16 years ago Actually close the connection on disconnect, fixing #3. Property svn:keywords set to Rev File size: 9.1 KB Line   1 /* 2  * Written by Dawid Kurzyniec and released to the public domain, as explained 3  * at http://creativecommons.org/licenses/publicdomain 4  */ 5 6 //package edu.emory.mathcs.util.net; 7 8 import java.io.*; 9 import java.net.*; 10 import java.nio.channels.*; 11 12 /** 13  * Wrapper for sockets which enables to add functionality in subclasses 14  * on top of existing, connected sockets. It is useful when direct subclassing 15  * of delegate socket class is not possible, e.g. if the delegate socket is 16  * created by a library. Possible usage example is socket factory chaining. 17  * This class delegates all socket-related requests to the wrapped delegate, 18  * as of JDK 1.4. 19  * 20  * @author Dawid Kurzyniec 21  * @version 1.4 22  */ 23 public abstract class SocketWrapper extends Socket { 24 25     /** 26      * the wrapped delegate socket. 27      */ 28     protected final Socket delegate; 29 30     /** 31      * Creates new socket wrapper for a given socket. The delegate 32      * must be connected and bound and it must not be closed. 33      * @param delegate the delegate socket to wrap 34      * @throws SocketException if the delegate socket is closed, not bound, 35      *                         or not connected 36      */ 37     protected SocketWrapper(Socket delegate) throws SocketException { 38         super(new WrappingSocketImpl(delegate)); 39         this.delegate = delegate; 40         System.out.println("Creating SocketWrapper $Rev: 233 $"); 41     } 42 43     public SocketChannel getChannel() { 44         return delegate.getChannel(); 45     } 46 47     /** 48      * Returns true, indicating that the socket is bound. 49      * 50      * @return true 51      */ 52     public boolean isBound() { 53         return true; 54     } 55 56     public boolean isClosed() { 57         return super.isClosed() || delegate.isClosed(); 58     } 59 60     /** 61      * Returns true, indicating that the socket is connected. 62      * 63      * @return true 64      */ 65     public boolean isConnected() { 66         return true; 67     } 68 69     public boolean isInputShutdown() { 70         return super.isInputShutdown() || delegate.isInputShutdown(); 71     } 72 73     public boolean isOutputShutdown() { 74         return super.isInputShutdown() || delegate.isOutputShutdown(); 75     } 76 77     private static class WrappingSocketImpl extends SocketImpl { 78         private final Socket delegate; 79         WrappingSocketImpl(Socket delegate) throws SocketException { 80             if (delegate == null) { 81                 throw new NullPointerException(); 82             } 83             if (delegate.isClosed()) { 84                 throw new SocketException("Delegate server socket is closed"); 85             } 86             if (!(delegate.isBound())) { 87                 throw new SocketException("Delegate server socket is not bound"); 88             } 89             if (!(delegate.isConnected())) { 90                 throw new SocketException("Delegate server socket is not connected"); 91             } 92             this.delegate = delegate; 93         } 94 95         protected void create(boolean stream) {} 96 97         protected void connect(String host, int port) { 98             // delegate is always connected, thus this method is never called 99             throw new UnsupportedOperationException(); 100         } 101 102         protected void connect(InetAddress address, int port) { 103             // delegate is always connected, thus this method is never called 104             throw new UnsupportedOperationException(); 105         } 106 107         protected void connect(SocketAddress address, int timeout) { 108             // delegate is always connected, thus this method is never called 109             throw new UnsupportedOperationException(); 110         } 111 112         protected void bind(InetAddress host, int port) { 113             // delegate is always bound, thus this method is never called 114             throw new UnsupportedOperationException(); 115         } 116 117         protected void listen(int backlog) { 118             // this wrapper is never used by a ServerSocket 119             throw new UnsupportedOperationException(); 120         } 121 122         protected void accept(SocketImpl s) { 123             // this wrapper is never used by a ServerSocket 124             throw new UnsupportedOperationException(); 125         } 126 127         protected InputStream getInputStream() throws IOException { 128             return delegate.getInputStream(); 129         } 130 131         protected OutputStream getOutputStream() throws IOException { 132             return delegate.getOutputStream(); 133         } 134 135         protected int available() throws IOException { 136             return getInputStream().available(); 137         } 138 139         protected void close() throws IOException { 140             System.out.println("Calling delegate.close"); 141             delegate.close(); 142         } 143 144         protected void shutdownInput() throws IOException { 145             delegate.shutdownInput(); 146         } 147 148         protected void shutdownOutput() throws IOException { 149             delegate.shutdownOutput(); 150         } 151 152         protected FileDescriptor getFileDescriptor() { 153             // this wrapper is never used by a ServerSocket 154             throw new UnsupportedOperationException(); 155         } 156 157         protected InetAddress getInetAddress() { 158             return delegate.getInetAddress(); 159         } 160 161         protected int getPort() { 162             return delegate.getPort(); 163         } 164 165         protected boolean supportsUrgentData() { 166             return false; // must be overridden in sub-class 167         } 168 169         protected void sendUrgentData (int data) throws IOException { 170             delegate.sendUrgentData(data); 171         } 172 173         protected int getLocalPort() { 174             return delegate.getLocalPort(); 175         } 176 177         public Object getOption(int optID) throws SocketException { 178             switch (optID) { 179                 case SocketOptions.IP_TOS: 180                     return new Integer(delegate.getTrafficClass()); 181                 case SocketOptions.SO_BINDADDR: 182                     return delegate.getLocalAddress(); 183                 case SocketOptions.SO_KEEPALIVE: 184                     return Boolean.valueOf(delegate.getKeepAlive()); 185                 case SocketOptions.SO_LINGER: 186                     return new Integer(delegate.getSoLinger()); 187                 case SocketOptions.SO_OOBINLINE: 188                     return Boolean.valueOf(delegate.getOOBInline()); 189                 case SocketOptions.SO_RCVBUF: 190                     return new Integer(delegate.getReceiveBufferSize()); 191                 case SocketOptions.SO_REUSEADDR: 192                     return Boolean.valueOf(delegate.getReuseAddress()); 193                 case SocketOptions.SO_SNDBUF: 194                     return new Integer(delegate.getSendBufferSize()); 195                 case SocketOptions.SO_TIMEOUT: 196                     return new Integer(delegate.getSoTimeout()); 197                 case SocketOptions.TCP_NODELAY: 198                     return Boolean.valueOf(delegate.getTcpNoDelay()); 199                 case SocketOptions.SO_BROADCAST: 200                 default: 201                     throw new IllegalArgumentException("Unsupported option type"); 202             } 203         } 204 205         public void setOption(int optID, Object value) throws SocketException { 206             switch (optID) { 207                 case SocketOptions.SO_BINDADDR: 208                     throw new IllegalArgumentException("Socket is bound"); 209                 case SocketOptions.SO_KEEPALIVE: 210                     delegate.setKeepAlive(((Boolean)value).booleanValue()); 211                     break; 212                 case SocketOptions.SO_LINGER: 213                     if (value instanceof Boolean) { 214                         delegate.setSoLinger(((Boolean)value).booleanValue(), 0); 215                     } 216                     else { 217                         delegate.setSoLinger(true, ((Integer)value).intValue()); 218                     } 219                     break; 220                 case SocketOptions.SO_OOBINLINE: 221                     delegate.setOOBInline(((Boolean)value).booleanValue()); 222                     break; 223                 case SocketOptions.SO_RCVBUF: 224                     delegate.setReceiveBufferSize(((Integer)value).intValue()); 225                     break; 226                 case SocketOptions.SO_REUSEADDR: 227                     delegate.setReuseAddress(((Boolean)value).booleanValue()); 228                     break; 229                 case SocketOptions.SO_SNDBUF: 230                     delegate.setSendBufferSize(((Integer)value).intValue()); 231                     break; 232                 case SocketOptions.SO_TIMEOUT: 233                     delegate.setSoTimeout(((Integer)value).intValue()); 234                     break; 235                 case SocketOptions.TCP_NODELAY: 236                     delegate.setTcpNoDelay(((Boolean)value).booleanValue()); 237                     break; 238                 case SocketOptions.SO_BROADCAST: 239                 default: 240                     throw new IllegalArgumentException("Unsupported option type"); 241             } 242         } 243     } 244 245     public void close() throws IOException { 246         System.out.println("Calling SocketWrapper.delegate.close"); 247         delegate.close(); 248     } 249 250     public boolean equals(Object obj) { 251         if (!(obj instanceof SocketWrapper)) return false; 252         SocketWrapper that = (SocketWrapper)obj; 253         return this.delegate.equals(that.delegate); 254     } 255 256     public int hashCode() { 257         return delegate.hashCode() ^ 0x01010101; 258     } 259     public String toString() { 260         return ""; 261     } 262 } Note: See TracBrowser for help on using the repository browser. Download in other formats: Plain Text Original Format Powered by Trac 1.0.2 By Edgewall Software. Visit the Trac open source project at http://trac.edgewall.org/