我的问题是,当我在发布到服务器后尝试打开流时getInputStream()
挂起。用python编写的服务器给出了一条错误消息,让我相信它无法正确解析我的查询字符串。请帮我诊断一下这个问题。
我使用以下代码发布到Web服务器:
String boundarySolo = "--158211729626281";
String boundary = boundarySolo + "\r\n";
String contentHeader = "Content-Disposition: form-data; name=\"";
URL requestUrl;
URLConnection connection;
String queryString = new String();
try{
requestUrl = new URL(config.getServerUrl());
connection = requestUrl.openConnection();
connection.setReadTimeout(1000);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundarySolo);
。 。 。
outStream = new DataOutputStream(connection.getOutputStream());
System.out.println("Writing bytes...");
outStream.writeUTF(queryString);
System.out.println("Bytes written");
outStream.flush();
System.out.println("Buffer flushed.");
outStream.close();
System.out.println("Stream closed.");
try{
inStream = new DataInputStream(connection.getInputStream());
String buffer;
System.out.println("Entering the loop.");
while((buffer = inStream.readLine())!= null)
System.out.println(buffer);
System.out.println("Leaving the loop.");
}
catch (SocketTimeoutException e) {
System.out.println("Socket timed out.");
}
查询字符串由此组成(每行末尾有\r\n
):
--158211729626281
Content-Disposition: form-data; name="view"
a
--158211729626281
Content-Disposition: form-data; name="termdb"
Saccharomyces_cerevisiae.etd
--158211729626281
Content-Disposition: form-data; name="raw_weights"
blank
--158211729626281
Content-Disposition: form-data; name="MAX_FILE_SIZE"
256
--158211729626281
Content-Disposition: form-data; name="cutoff_Evalue"
0.01
--158211729626281
Content-Disposition: form-data; name="min_term_size"
2
--158211729626281
Content-Disposition: form-data; name="effective_tdb_size"
0
--158211729626281
Content-Disposition: form-data; name="stats"
wsum
--158211729626281
Content-Disposition: form-data; name="transform_weights"
null
--158211729626281
Content-Disposition: form-data; name="cutoff_type"
none
--158211729626281
Content-Disposition: form-data; name="output"
tab
--158211729626281--
答案 0 :(得分:6)
如果我没记错的话,URLConnection#getInputStream()实际上是将请求发送到服务器(如果写入输出流的请求不够大而导致刷新)。然后它会挂起,直到从服务器刷新响应。
你可以在服务器上调试吗?通过这种方式,您可以了解它获得了多远以及连接保持打开的原因。如果服务器要关闭连接,我会期望客户端出现异常。
如果您使用的是Eclipse,请使用“窗口”菜单 - >显示视图 - >其他并选择TCP / IP Monitor。您可以使用它来真正看到通过线路发送的内容。
答案 1 :(得分:0)
尝试使用http://apikitchen.com/之类的内容测试您的有效负载 并看看返回了什么。
另一种方法是避免完全自己这样做。 HTTPClient,Jersey Client和Resty(我是其作者)解决了这个问题,而不必深入研究HTTP和mime类型的深度。
这是一个让你入门的Resty例子:
import us.monoid.web.Resty;
import static us.monoid.web.Resty.*;
Resty r = new Resty();
String result = r.text(config.getServerUrl(),
form(data("MAX_FILE_SIZE","256"),
data("stats", "wsum"),...etc.etc.).toString();
(假设服务器正在返回text / *)