ProxySOCKS4.java
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 package com.jcraft.jsch;
00040
00041 import java.io.*;
00042 import java.net.*;
00043
00044
00052 public class ProxySOCKS4 implements Proxy{
00053 private static int DEFAULTPORT=1080;
00054 private String proxy_host;
00055 private int proxy_port;
00056 private InputStream in;
00057 private OutputStream out;
00058 private Socket socket;
00059 private String user;
00060 private String passwd;
00061
00067 public ProxySOCKS4(String proxy_host){
00068 int port=DEFAULTPORT;
00069 String host=proxy_host;
00070 if(proxy_host.indexOf(':')!=-1){
00071 try{
00072 host=proxy_host.substring(0, proxy_host.indexOf(':'));
00073 port=Integer.parseInt(proxy_host.substring(proxy_host.indexOf(':')+1));
00074 }
00075 catch(Exception e){
00076 }
00077 }
00078 this.proxy_host=host;
00079 this.proxy_port=port;
00080 }
00086 public ProxySOCKS4(String proxy_host, int proxy_port){
00087 this.proxy_host=proxy_host;
00088 this.proxy_port=proxy_port;
00089 }
00090
00091
00101 public void setUserPasswd(String user, String passwd){
00102 this.user=user;
00103 this.passwd=passwd;
00104 }
00105
00106
00107 public void connect(SocketFactory socket_factory, String host, int port, int timeout) throws JSchException{
00108 try{
00109 if(socket_factory==null){
00110 socket=Util.createSocket(proxy_host, proxy_port, timeout);
00111
00112 in=socket.getInputStream();
00113 out=socket.getOutputStream();
00114 }
00115 else{
00116 socket=socket_factory.createSocket(proxy_host, proxy_port);
00117 in=socket_factory.getInputStream(socket);
00118 out=socket_factory.getOutputStream(socket);
00119 }
00120 if(timeout>0){
00121 socket.setSoTimeout(timeout);
00122 }
00123 socket.setTcpNoDelay(true);
00124
00125 byte[] buf=new byte[1024];
00126 int index=0;
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 index=0;
00147 buf[index++]=4;
00148 buf[index++]=1;
00149
00150 buf[index++]=(byte)(port>>>8);
00151 buf[index++]=(byte)(port&0xff);
00152
00153 try{
00154 InetAddress addr=InetAddress.getByName(host);
00155 byte[] byteAddress = addr.getAddress();
00156 for (int i = 0; i < byteAddress.length; i++) {
00157 buf[index++]=byteAddress[i];
00158 }
00159 }
00160 catch(UnknownHostException uhe){
00161 throw new JSchException("ProxySOCKS4: "+uhe.toString(), uhe);
00162 }
00163
00164 if(user!=null){
00165 System.arraycopy(Util.str2byte(user), 0, buf, index, user.length());
00166 index+=user.length();
00167 }
00168 buf[index++]=0;
00169 out.write(buf, 0, index);
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198 int len=8;
00199 int s=0;
00200 while(s<len){
00201 int i=in.read(buf, s, len-s);
00202 if(i<=0){
00203 throw new JSchException("ProxySOCKS4: stream is closed");
00204 }
00205 s+=i;
00206 }
00207 if(buf[0]!=0){
00208 throw new JSchException("ProxySOCKS4: server returns VN "+buf[0]);
00209 }
00210 if(buf[1]!=90){
00211 try{ socket.close(); }
00212 catch(Exception eee){
00213 }
00214 String message="ProxySOCKS4: server returns CD "+buf[1];
00215 throw new JSchException(message);
00216 }
00217 }
00218 catch(RuntimeException e){
00219 throw e;
00220 }
00221 catch(Exception e){
00222 try{ if(socket!=null)socket.close(); }
00223 catch(Exception eee){
00224 }
00225 throw new JSchException("ProxySOCKS4: "+e.toString());
00226 }
00227 }
00228
00229
00230 public InputStream getInputStream(){ return in; }
00231
00232
00233 public OutputStream getOutputStream(){ return out; }
00234
00235
00236 public Socket getSocket(){ return socket; }
00237
00238
00239 public void close(){
00240 try{
00241 if(in!=null)in.close();
00242 if(out!=null)out.close();
00243 if(socket!=null)socket.close();
00244 }
00245 catch(Exception e){
00246 }
00247 in=null;
00248 out=null;
00249 socket=null;
00250 }
00251
00255 public static int getDefaultPort(){
00256 return DEFAULTPORT;
00257 }
00258 }