使用HttpURLConnection连接http服务器,如何判断是否连接成功 本帖最后由 paodan 于 2010-03-01 19:17:07 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.wangchao.net.cn/bbsdetail_39470.html lz 可以看看 import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;public class HttpURLConnectionTest { public static void testConnect(String surl) throws IOException { URL url = new URL(surl); String userInfo = url.getUserInfo(); if (userInfo != null && userInfo.length() > 0) { String string = surl.replace(userInfo, ""); url = new URL(string); } HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (userInfo != null && userInfo.length() > 0) connection.setRequestProperty("Authorization", userInfo); connection.connect(); System.out.println(connection.getResponseCode());//如果hhtp服务器不需要验证,输出200 } public static void testConnect2(String surl) throws IOException { URL url = new URL(surl); String userInfo = url.getUserInfo(); if (userInfo != null && userInfo.length() > 0) { String string = surl.replace(userInfo, ""); url = new URL(string); } HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); StringBuffer sb = new StringBuffer(); sb.append("userName=" + "aaa"); sb.append("&password=" + "bbb"); //post信息 OutputStream os = connection.getOutputStream(); os.write(sb.toString().getBytes("GBK")); os.close(); connection.connect(); System.out.println(connection.getResponseCode());//如果hhtp服务器需要验证时,输出401 } public static void main(String args[]) throws IOException { String url = "http://192.9.168.11:1122/"; testConnect(url); //testConnect2(url); }}如果没有密码时输出200,有密码时输出401,如何发送用户名和密码? 如果hhtp服务器需要验证时,输出401改正:如果http服务器需要验证时,输出401 HttpURLConnection是如何发送用户名和密码的? 可以将用户名和密码写在URL中,用username= &password= HttpURLConnection.HTTP_OK==httpConn.getResponseCode();它们相等,就是成功连接! 试了"http://username=aa&[email protected]:1122/";不行,输出401 HttpURLConnection.HTTP_OK==httpConn.getResponseCode();它们相等,就是成功连接! 这只是检测url和端口是否正确,如果有用户名和密码的如何连接,即如何发送用户名和密码? 调用connect方法,没有捕获到异常就是连接上了 这里再说明一下,可以参考一下7楼的代码,对于Http服务器(IIS或者Apache等),如果url和端口正确,都会返回200,也就是说不管Http服务器是否需要用户认证,只要是http://url:端口正确,返回码都会是200. 因此想请教一下如果http服务器需要认证的,如何传递认证信息(用户名和密码),除了返回200,还会返回什么有用的信息(与不需要认证的区别信息)? public static boolean isConnectedUrl(String url) { HttpURLConnection con; try { HttpURLConnection.setFollowRedirects(false); con = (HttpURLConnection) new URL(url) .openConnection(); con.setRequestMethod("HEAD"); System.out.println("state code:" + con.getResponseCode()); if (con.getResponseCode() == HttpURLConnection.HTTP_OK) { return true; } } catch (MalformedURLException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } return false; } 谢谢,这个方法用过,对于需要认证的Http服务器url格式是怎么样的?比如http://192.168.200.9:8002,用户名和密码为user/paswwd,试过这样的http://user:[email protected]:8002,但是返回了401,连接失败。不知道如何发送认证信息。 可以看下这个:import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.Authenticator;import java.net.InetAddress;import java.net.PasswordAuthentication;import java.net.URL;public class Test { public static void main(String[] argv) throws Exception { Authenticator.setDefault(new MyAuthenticator()); URL url = new URL("http://hostname:80/index.html"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; while ((str = in.readLine()) != null) { System.out.println(str); } in.close(); }}class MyAuthenticator extends Authenticator { protected PasswordAuthentication getPasswordAuthentication() { String promptString = getRequestingPrompt(); System.out.println(promptString); String hostname = getRequestingHost(); System.out.println(hostname); InetAddress ipaddr = getRequestingSite(); System.out.println(ipaddr); int port = getRequestingPort(); String username = "name"; String password = "password"; return new PasswordAuthentication(username, password.toCharArray()); }} 这个可以,稍微修改一下就行,还有需要设置一下流的字符编码,html中带有汉字的连接显示乱码,因此需要根据不同的页面设置编码。import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.Authenticator;import java.net.InetAddress;import java.net.PasswordAuthentication;import java.net.URL;/** * TODO javadoc for http.AuthenticatorTest * * @author wanghan */public class AuthenticatorTest { public static void main(String[] argv) throws Exception { Authenticator.setDefault(new MyAuthenticator("user","passwd")); URL url = new URL("http://192.168.200.10:8002"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));//这里根据服务器编码设置 String str; while ((str = in.readLine()) != null) { System.out.println(str); } in.close(); }}class MyAuthenticator extends Authenticator { private String name; private String passwd; public MyAuthenticator(String name,String passwd){ this.name = name; this.passwd = passwd; } protected PasswordAuthentication getPasswordAuthentication() { String promptString = getRequestingPrompt(); System.out.println(promptString); String hostname = getRequestingHost(); System.out.println(hostname); InetAddress ipaddr = getRequestingSite(); System.out.println(ipaddr); //int port = getRequestingPort(); String username = name; String password = passwd; return new PasswordAuthentication(username, password.toCharArray()); } } 谢谢35楼,用35楼的方法可以通过认证,我之前用HttpClient 认证一直没有成功。 System.out.println("state code:" + con.getResponseCode());我这里直接出错。没打印出来 ftpclient读取ftpserver文件只读第一行的问题 正则表达式匹配问题 希望大家推荐一下好的JAVA的源程序或开源项目 JAVA问题,如何引用一个函数的数组返回值(急!在线等,有分送) 关于线程的问题!急等! 请教了(来者有分) 请问那里有JTest下载 ??? Java Socket发送数据求助 SELECT 地名 FROM 世界地图 WHERE 意思=“车上有两车夫”;---打一地名。 一个关于import的问题 mysql 中文乱码问题 关于java剔除手机黑名单的算法,有没有更好的?
lz 可以看看
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;public class HttpURLConnectionTest {
public static void testConnect(String surl) throws IOException {
URL url = new URL(surl);
String userInfo = url.getUserInfo();
if (userInfo != null && userInfo.length() > 0) {
String string = surl.replace(userInfo, "");
url = new URL(string);
}
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (userInfo != null && userInfo.length() > 0)
connection.setRequestProperty("Authorization", userInfo);
connection.connect();
System.out.println(connection.getResponseCode());//如果hhtp服务器不需要验证,输出200 }
public static void testConnect2(String surl) throws IOException {
URL url = new URL(surl);
String userInfo = url.getUserInfo();
if (userInfo != null && userInfo.length() > 0) {
String string = surl.replace(userInfo, "");
url = new URL(string);
}
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
StringBuffer sb = new StringBuffer();
sb.append("userName=" + "aaa");
sb.append("&password=" + "bbb");
//post信息
OutputStream os = connection.getOutputStream();
os.write(sb.toString().getBytes("GBK"));
os.close();
connection.connect();
System.out.println(connection.getResponseCode());//如果hhtp服务器需要验证时,输出401 }
public static void main(String args[]) throws IOException {
String url = "http://192.9.168.11:1122/";
testConnect(url);
//testConnect2(url);
}}如果没有密码时输出200,有密码时输出401,如何发送用户名和密码?
改正:如果http服务器需要验证时,输出401
它们相等,就是成功连接!
它们相等,就是成功连接!
HttpURLConnection con;
try {
HttpURLConnection.setFollowRedirects(false);
con = (HttpURLConnection) new URL(url)
.openConnection();
con.setRequestMethod("HEAD");
System.out.println("state code:" + con.getResponseCode());
if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
return true;
}
} catch (MalformedURLException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return false;
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.InetAddress;
import java.net.PasswordAuthentication;
import java.net.URL;public class Test {
public static void main(String[] argv) throws Exception {
Authenticator.setDefault(new MyAuthenticator());
URL url = new URL("http://hostname:80/index.html"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String str;
while ((str = in.readLine()) != null) {
System.out.println(str);
}
in.close();
}
}class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
String promptString = getRequestingPrompt();
System.out.println(promptString);
String hostname = getRequestingHost();
System.out.println(hostname);
InetAddress ipaddr = getRequestingSite();
System.out.println(ipaddr);
int port = getRequestingPort(); String username = "name";
String password = "password";
return new PasswordAuthentication(username, password.toCharArray());
}
}
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.InetAddress;
import java.net.PasswordAuthentication;
import java.net.URL;
/**
* TODO javadoc for http.AuthenticatorTest
*
* @author wanghan
*/
public class AuthenticatorTest {
public static void main(String[] argv) throws Exception {
Authenticator.setDefault(new MyAuthenticator("user","passwd"));
URL url = new URL("http://192.168.200.10:8002"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));//这里根据服务器编码设置
String str;
while ((str = in.readLine()) != null) {
System.out.println(str);
}
in.close();
}
}
class MyAuthenticator extends Authenticator {
private String name;
private String passwd;
public MyAuthenticator(String name,String passwd){
this.name = name;
this.passwd = passwd;
}
protected PasswordAuthentication getPasswordAuthentication() {
String promptString = getRequestingPrompt();
System.out.println(promptString);
String hostname = getRequestingHost();
System.out.println(hostname);
InetAddress ipaddr = getRequestingSite();
System.out.println(ipaddr);
//int port = getRequestingPort(); String username = name;
String password = passwd;
return new PasswordAuthentication(username, password.toCharArray());
}
}
我这里直接出错。没打印出来