我正在编写自己的HTTP客户端和服务器,并希望客户端在请求中包含一个可选的主体.在服务器端,我想在发送HTTP响应之前读取整个主体.我的问题是在服务器上我怎么知道我已经阅读了整个身体?
即使在这种情况下我控制客户端和服务器,我正在寻找一种"标准"方法.但是,由于Content-Length是可选的,我想要一个不需要它的方法.如果客户端关闭连接,则很容易读取所有可用数据,但客户端需要保持连接打开以等待响应,因此此方法不起作用.
我能想到的只有身体的格式和检测终结者(例如</HTML>).理想情况下,我不想要那些知识.
我有一种方法可以忽略吗?
我使用AmazonSQSAsyncClient连接Amazon SQS,但有时我在日志中看到以下执行:
INFO [AmazonHttpClient:444] Unable to execute HTTP request: Connection reset
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:755)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
at com.amazonaws.http.protocol.SdkHttpRequestExecutor.doReceiveResponse(SdkHttpRequestExecutor.java:66)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:380)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:229)
at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:2169)
at com.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl(AmazonSQSClient.java:468)
at com.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl(AmazonSQSClient.java:1476)
Run Code Online (Sandbox Code Playgroud)
我正在使用AmazonSQSAsyncClient作为单例的应用程序.
代码段如下.
static{
if(sqsObj == null){
sqsObj = …Run Code Online (Sandbox Code Playgroud) 我正在接管java Web服务客户端的开发,为了测试进化,我必须从远程Web服务服务器(嵌入在tomcat实例中运行的Apache Axis2中)中请求一个方法.
首先,我使用服务器提供的WSDL通过SOAP UI请求了该方法.它工作正常.
现在我尝试通过我的Java Web服务客户端请求该方法,但我无法连接到服务器,即使使用SOAP UI测试证明一切都很好.
java Web服务客户端依赖于Spring-WS.
// Setting the kycScoreRequest
...
// Trying to connect and to get the kycScoreResponse
KycScoreResponse kycScoreResponse = (KycScoreResponse) getWebServiceTemplate().marshalSendAndReceive(kycScoreRequest);
Run Code Online (Sandbox Code Playgroud)
[main] DEBUG com.foo.AbstractMain - org.springframework.ws.client.WebServiceIOException: I/O error: Connection timed out: connect; nested exception is java.net.ConnectException: Connection timed out: connect
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:545)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:386)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:380)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:372)
at com.foo.MainKycScore.getReturn(MainKycScore.java:37)
at com.foo.MainKycScore.main(MainKycScore.java:244)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud) 我在下载网页的HTML时遇到了一些麻烦(请参阅此问题:Android:下载HTML并不总是有效).
在我的代码中,我使用此方法:
HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000);
Run Code Online (Sandbox Code Playgroud)
我不太确定这意味着什么.这是否意味着如果下载HTML文件(我使用它)的时间超过3000毫秒,它会停止吗?或者它意味着什么呢?
另外,那个方法和它有什么区别setSoTimeout?