我的应用程序需要通过http://127.0.0.1/...(localhost url)联系它正在处理的同一设备.
出于某种原因,当我到达那里有JSON内容的网站时,大约50%的时间(可能正好是50%),我得到例外:
java.net.SocketException:recvfrom失败:ECONNRESET(由对等方重置连接)
对于其他50%,我得到了非常好的结果.我试图进行民意调查(甚至民意调查之间的延迟很大),但我仍然得到同样奇怪的结果.
我搜索过互联网,也在这里,我不确定为什么会这样.对等方是否意味着客户端已经造成了这种情况?为什么会这样,我该如何处理?
一些网站说这是常见的事情,但我没有找到在这种情况下最好的事情.
我正在尝试解析facebook的首页,JSoup但我总是得到移动设备的HTML代码而不是普通浏览器的版本(在我的情况下是Firefox 5.0).
我正在设置我的用户代理:
doc = Jsoup.connect(url)
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0")
.get();
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?
编辑:
我刚刚解析了http://whatsmyuseragent.com/,看起来用户代理正在运行.现在,为什么网站http://www.facebook.com/在使用JSoup和我的浏览器时会返回不同的版本,这让我更加困惑.两者都使用相同的用户....
我现在也注意到了其他一些网站上的这种行为.如果你能向我解释问题是什么,我会非常高兴.
首先,如果我的术语有点业余,我很抱歉,试着忍受我;)
我试图将HTTP响应的gzipped主体转换为明文.我已经采用了这个响应的字节数组并将其转换为ByteArrayInputStream.然后我将其转换为GZIPInputStream.我现在想要读取GZIPInputStream并将最终解压缩的HTTP响应主体存储为纯文本字符串.
此代码将最终解压缩的内容存储在OutputStream中,但我想将内容存储为String:
public static int sChunk = 8192;
ByteArrayInputStream bais = new ByteArrayInputStream(responseBytes);
GZIPInputStream gzis = new GZIPInputStream(bais);
byte[] buffer = new byte[sChunk];
int length;
while ((length = gzis.read(buffer, 0, sChunk)) != -1) {
out.write(buffer, 0, length);
}
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何在URL中传递多个参数.我想将我的android类的纬度和经度传递给java servlet.我怎样才能做到这一点?
URL url;
double lat=touchedPoint.getLatitudeE6() / 1E6;
double lon=touchedPoint.getLongitudeE6() / 1E6;
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+lon);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输出(写入文件)是28.53438677.472097.这是有效的,但我想在两个单独的参数中传递纬度和经度,以便减少我在服务器端的工作.如果不可能,我怎么能至少在lat和lon之间添加一个空格,以便我可以使用tokenizer类来获取我的纬度和经度.我尝试过以下行,但无济于事.
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+" "+lon);
output- Nothing is written to file
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"&?param2="+lon);
output- 28.534386 (Only Latitude)
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"?param2="+lon);
output- 28.532577?param2=77.502996
Run Code Online (Sandbox Code Playgroud)
我的servlet代码如下:
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
final String par1 = req.getParameter("param1");
final String par2 = req.getParameter("param2");
FileWriter fstream = new FileWriter("C:\\Users\\Hitchhiker\\Desktop\\out2.txt");
BufferedWriter out = new BufferedWriter(fstream);
out.write(par1);
out.append(par2);
out.close();
Run Code Online (Sandbox Code Playgroud)
此外,我想知道这是将数据从Android设备传递到服务器的最安全和最安全的方式.
我正在使用这样的代码创建一个简单的URL请求:
URL url = new URL(webpage);
URLConnection urlConnection = url.openConnection();
InputStream is = urlConnection.getInputStream();
Run Code Online (Sandbox Code Playgroud)
但是在最后一行,我得到了"重定向太多次错误".如果我的"网页"var是google.com,那么它可以正常工作,但是当我尝试使用我的servlet的URL时,它就失败了.我似乎可以通过以下方式调整重定向后的次数(默认为20):
System.setProperty("http.maxRedirects", "100");
Run Code Online (Sandbox Code Playgroud)
但是当我把它调到100时,它肯定需要更长的时间来抛出错误所以我知道它正在尝试.但是,我的servlet的URL在(任何)浏览器中工作正常,并使用firebug中的"persist"选项,它似乎只重定向一次.
关于我的servlet的更多信息...它在tomcat中运行,并使用'mod-proxy-ajp'在apache前面运行.另外值得注意的是,它使用的是表单身份验证,因此您输入的任何URL都应该将您重定向到登录页面.正如我所说,这在所有浏览器中都能正常工作,但由于某些原因,重定向不适用于Java 6中的URLConnection.
感谢阅读...想法?
这是我的代码:
String addr = "http://172.26.41.18:8080/domain/list";
URL url = new URL(addr);
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setDoOutput(true);
httpCon.setDoInput(true);
httpCon.setUseCaches(false);
httpCon.setAllowUserInteraction(false);
httpCon.setRequestMethod("GET");
httpCon.addRequestProperty("Authorization", "Basic YWRtaW4fYFgjkl5463");
httpCon.connect();
OutputStreamWriter out = new OutputStreamWriter(httpCon.getOutputStream());
System.out.println(httpCon.getResponseCode());
System.out.println(httpCon.getResponseMessage());
out.close();
Run Code Online (Sandbox Code Playgroud)
我在回应中看到了什么:
500服务器错误
我打开我的httpConvar,以及我看到的内容:
POST/rest/platform/domain/list HTTP/1.1
为什么它设置为POST,即使我已经习惯httpCon.setRequestMethod("GET");将其设置为GET?
它在HTTP上运行良好,但是当我尝试使用HTTPS源时,它会抛出以下异常:
10-12 13:22:11.169: WARN/System.err(332): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
10-12 13:22:11.179: WARN/System.err(332): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:477)
10-12 13:22:11.179: WARN/System.err(332): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:328)
10-12 13:22:11.179: WARN/System.err(332): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.setupSecureSocket(HttpConnection.java:185)
10-12 13:22:11.179: WARN/System.err(332): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:433)
10-12 13:22:11.189: WARN/System.err(332): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:378)
10-12 13:22:11.189: WARN/System.err(332): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205)
10-12 13:22:11.189: WARN/System.err(332): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:152)
10-12 13:22:11.189: WARN/System.err(332): at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:377)
10-12 13:22:11.189: WARN/System.err(332): at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:364)
10-12 13:22:11.189: WARN/System.err(332): at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:143)
Run Code Online (Sandbox Code Playgroud)
这是相关的代码:
try {
doc = Jsoup.connect("https url here").get();
} catch (IOException e) {
Log.e("sys","coudnt get the html"); …Run Code Online (Sandbox Code Playgroud) 本org.apache.http类和AndroidHttpClient类已经被弃用的Android 5.1.这些类不再被维护,您应该尽快使用这些API将任何应用程序代码迁移到URLConnection类.
https://developer.android.com/about/versions/android-5.1.html#http
它建议切换到URLConnection类.没有足够的文件记录如何从应用程序进行发布呼叫.
目前我正在使用这个
public void postData()
{
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");
try
{
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
}
catch (ClientProtocolException e)
{
// TODO Auto-generated catch block
}
catch (IOException e)
{
// TODO …Run Code Online (Sandbox Code Playgroud) 我想用cookies手动GET以下载和解析网页.我需要提取安全令牌,以便在论坛上发帖.我已完成登录,已阅读响应并提取了cookie(3对(名称,值)).然后我写了包含这样的cookie的String:
CookieString="name1=value1; name2=value2; name3=value3"
Run Code Online (Sandbox Code Playgroud)
然后我做以下事情
HttpURLConnection connection
connection = (HttpURLConnection)(new URL(Link).openConnection());
connection.setRequestMethod("GET");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Cookie", CookieString );
connection.connect();
Run Code Online (Sandbox Code Playgroud)
然后我阅读了该页面,但它显示我没有登录论坛.我究竟做错了什么?
编辑:我知道如果我想发帖,我必须提取安全令牌.我的思路是,为了提取它,我需要获取这个特定的页面.但是为了将安全令牌作为隐藏字段,我必须在线,因此我需要cookie.但是,当我获取页面并设置上面提到的cookie时,我将该页面作为访客,它表明我不在线,安全令牌的值是guest,这对我没用.我会检查你给我的链接,希望能找到解决方案.
我想设置一个http连接来发送请求并在一个独立的java应用程序中获取响应,任何人都可以帮助我如何继续这个????