ورود

View Full Version : سوال: Proxy Socket Authentication



Java_traine
چهارشنبه 20 آبان 1388, 16:15 عصر
من مي خواهم با استفاده از Socket به اينترنت وصل شوم اين کار با استفاده از کد زير به آساني امکان پذير است:


int ch;
Socket socket = new Socket("www.google.com", 80);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
String str = "GET /index.html HTTP/1.0\n\n";
byte buf[] = str.getBytes();
out.write(buf);
while ((ch = in.read()) != -1)
System.out.print((char) ch);
socket.close();

اين کد ، صفحه اصلي گوگل را خوانده و در کنسول چاپ مي کند.
حال اگر اتصال کامپيوتر بصورت مستقيم نباشد و کامپيوتر در محل شرکت يا اداره و از طريق يک پراکسي به اينترنت وصل شده باشد چگونه بايد عمل کرد. به عبارت ديگر اگر مشخصات پراکسي شرکت مانند زير باشد تغييرات کد بالا چه خواهد بود:


Proxy: 10.21.0.4
Port:3128
user: ali
password: 1234


در ضمن کد هاي زير را امتحان کرده ام و جواب نگرفته ام


Authenticator.setDefault(new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("ali", "1234".toCharArray());

}
});

System.setProperty("http.proxyHost","10.21.0.4");
System.setProperty("http.proxyPort","3128");

// System.getProperties().setProperty("http.proxyHost","10.21.0.4");
// System.getProperties().setProperty("http.proxyPort","3128");

SocketAddress proxyAddress = new InetSocketAddress("10.21.0.4", 3128);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddress);
Socket socket = new Socket(proxy);
SocketAddress internetSocketAddress = new InetSocketAddress("www.google.com", 80);
socket.connect(internetSocketAddress);
// Socket socket = new Socket("www.yahoo.com",80);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write("GET /index.html HTTP/1.0\n\n".getBytes());
int ch;
while ((ch = in.read()) != -1)
System.out.println(ch);
socket.close();



از اينکه براي راهنمايي من وقت خواهيد گذاشت ممنونم.

ناصرقلی
یک شنبه 24 آبان 1388, 10:22 صبح
اگر منظور شما از اتصال به اینترنت دریافت صفحات وب از اینترنت است از پروژه http://hc.apache.org/httpclient-3.x/ استفاده کنید و اگر منظور دیگری دارید سری به پروژه commons net بزنید شاید نیاز شما را بر آورده نماید.

manvaputra
یک شنبه 24 آبان 1388, 11:05 صبح
سلام دوست عزيز


System.getProperties().put( "proxySet", "true" );
System.getProperties().put( "proxyHost", "HOST" );
System.getProperties().put( "proxyPort", "85" );
خط اول مشخص مي كنه كه شما قراره از پروكسي استفاده كنيد و همونطور كه مي دونيد خط دو و سه آدرس و شماره پورت پروكسي سرور رو مشخص مي كنه.
همونطور كه خودتون هم بش اشاره فرموديد بعضي پروكسي سرور ها قبل از اجازه دسترسي به وب از شما Username و Password مي خوان پس بايد مراحل زير رو هم طي كرد:


URLConnection connection = url.openConnection();
String password = "username:password";
String encodedPassword = base64Encode( password );
connection.setRequestProperty( "Proxy-Authorization", encodedPassword );

Java_traine
دوشنبه 25 آبان 1388, 18:06 عصر
ضمن تشکر از پاسخ شما ، من کد زیر را امتحان کردم و Exception (خطای 407 ) که مربوط به Proxy Authentication می باشد را دریافت کردم:


System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", "10.21.0.4");
System.getProperties().put("proxyPort", "3128");

URLConnection connection = new URL("http://www.google.com/").openConnection();
String userNamePassword = "ali:1234";
String encodedPassword = Base64.encode(userNamePassword.getBytes());
connection.setRequestProperty( "Proxy-Authorization", encodedPassword );
connection.setDoOutput(true);
connection.setDoInput(true);

OutputStream out = connection.getOutputStream();
out.write("GET /index.html HTTP/1.0\n\n".getBytes());
InputStream in = connection.getInputStream();
int ch;
while ((ch = in.read()) != -1)
System.out.println(ch);


برای رفع اشکال کد زیر را به ابتدای آن اضافه کردم:


Authenticator.setDefault(new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("ali", "1234".toCharArray());

}
});


و دیگه Exception نداد ولی کار هم نکرد:ناراحت:
در صورت امکان راهنمایی فرمایید
در ضمن من صرفا برای کار وب نمی خواهم بلکه می خواهم سایر پورت ها را نیز بتوانم باز کنم و با استفاده از Stream ها با آنها داده رد و بدل کنم.
با تشکر مجدد.