e招募提示ping 请求超时时咋回事

服务器&Servlet+mysql,android客户端发送http向服务器请求数据,由于网络不通,连不上服务器,然后程序长期不响应。
求助如何获取连接超时事件,以便于避免长期不响应的尴尬?
回答: 如何判断http请求超时
catch&ConnectTimeoutException异常,就是超时了
Q 请问http协议支持客户段请求超时设置吗?
例如是否有下面的请求头字段
GET /encrypted-area HTTP/1.1
Host: www.example.com
TimeOut: 30
有timeOut(或者time-Out)这个字段吗?
问题补充:waterdh 写道timeout有connect timeout 和 read timeout
都是socket client代码层面去实现的, 和http协议本身无关
你好,socket层面我大概知道。我的意思是http协议头域里面有类似的timout字段吗? 也就是说我自己构造字符串头,加一个timeout字段(类似于&&&&&&&&&&&&&&&&&& ontent-length一样),http协议是否有这么一说?
问题补充:waterdh 写道http协议本身有keep-alive等字段,但不是用来控制timeout的。
你可以自定义http头, 但必须服务端和客户端支持,否则也是没有意义的。
谢谢。
你的意思是http协议本身没有timeout字段是吗?
keep-alive字段好像不能满足我的要求,因为我们的请求都是短连接的。
A 是的,没有timeout字段。
Q 如何判断http请求是用代码模拟发出的,而不是在浏览器里手动点击发出的
没办法的,你看网上这么多外挂就知道了,加密,不加密,一样有人能搞。
只能通过一些步骤上的细节去区分,比如速度、频度等。
Q JS判断页面&请求是否完成。
网上找了一大把都是说页面加载完成的判断。
加载的意思是:把HTML渲染到浏览器。
请求的意思是:浏览器向服务器请求内容。
情景:在自动测试中,要等待页面完全加载后才能进行下一步操作,判断页面加载完成了,只能说明页面已经请求完成到本地的内容,如果判断的时候还有内容因为网速等原因没有请求到本地。判断页面加载完成就不能达到预期的效果。所以想请教一下各位大神支点招。能不能判断正在请求服务器的内容已经请求完成了。
浏览器有请求没有完成的时候标题旁会有个图标在转。
各位大神们这个判断能做处理么?
浏览器自己的机制吧
Q 做了一个客户端,想捕获请求超时和响应超时异常
请求超时&&&&&&java.net.SocketTimeoutException:&connect&timed&out
响应超时&&&&&&java.net.SocketTimeoutException:&Read&timed&out
控制台输出以上两种异常,但捕获不到,只能捕获的是WebServiceException,下面是代码!
哪位帮个忙,指点一下!
JaxWsProxyFactoryBean&soapFactoryBean&=&new&JaxWsProxyFactoryBean();
soapFactoryBean.setAddress("http://10.19.116.123:8080/CXFServer/webServices/proxyService");&&&&
soapFactoryBean.setServiceClass(ProxyServiceInterface.class);
Object&o&=&soapFactoryBean.create();
ProxyServiceInterface&proxyService&=&(ProxyServiceInterface)&o;
org.apache.cxf.endpoint.Client&proxy&=&ClientProxy.getClient(proxyService);
HTTPConduit&conduit&=&(HTTPConduit)&proxy.getConduit();
HTTPClientPolicy&policy&=&new&HTTPClientPolicy();
policy.setConnectionTimeout(2000);&//连接超时时间&&经测试可用
policy.setReceiveTimeout(2000);//请求超时时间.经测试可用
conduit.setClient(policy);
//proxyService.add(user);
long&startTime=System.currentTimeMillis();&&&//获取开始时间
System.out.println(startTime);
ReadXmlBySaxResponse.parseXml(proxyService.xmlRequest("zzz",&"yyy",&"1236",&xmlStr));
long&endTime=System.currentTimeMillis();&//获取结束时间
System.out.println(endTime);
System.out.println("程序运行时间:&"+(endTime-startTime)+"ms");
ProxyUser[]&users=&proxyService.findAllUsers();
for(ProxyUser&u&:&users){
&&&&System.out.println(u.getUserName()+"."+u.getPassWord());
catch(Exception&e){
System.out.println(e);
if(e&instanceof&javax.xml.ws.WebServiceException)
System.out.println("&Catch&WebServiceException&!");
if(e.toString().indexOf("Could¬&send&Message")&0)
{System.out.println("&Catch&Could¬&send&Message!");}
//System.out.println(e.toString());
Read&timed&out的输出信息:
org.apache.cxf.interceptor.Fault:&Could¬&send&Message.
at&org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
at&org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at&org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570)
at&org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479)
at&org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)
at&org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)
at&org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at&org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
at&$Proxy39.xmlRequest(Unknown&Source)
at&com.neusoft.cxf.client.Client.main(Client.java:46)
Caused&by:&java.net.SocketTimeoutException:&SocketTimeoutException&invoking&http://10.19.116.123:8080/CXFServer/webServices/proxyService:&Read&timed&out
at&sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native&Method)
at&sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at&sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at&java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at&org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1347)
at&org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1331)
at&org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at&org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:632)
at&org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
...&9&more
Caused&by:&java.net.SocketTimeoutException:&Read&timed&out
at&java.net.SocketInputStream.socketRead0(Native&Method)
at&java.net.SocketInputStream.read(SocketInputStream.java:129)
at&java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at&java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at&java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at&sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:690)
at&sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
at&sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
at&java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
at&org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
at&org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1543)
at&org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1513)
at&org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1318)
...&12&more
javax.xml.ws.WebServiceException:&Could¬&send&Message.
&Catch&WebServiceException&!
&Catch&Could¬&send&Message!
你访问的服务断没有连接上
Q CInternetSession设置SendRequest请求超时时间,是否只能使用WinInet&API,照搬MSDN的说法的就不要回复了.我向HTTP服务器上传文件时,如果网络情况不理想,SendRequest超过30s没有返回,就会直接抛出12002超时异常.
1.如何将上传的超时时间设置为100s(而不是当前的30秒)最好不使用WinInet&API来上传文件.而直接在MFC封装类的基础上改动.
用WinHttp&API呢
Q 上传一个文件到HTTP服务器,WinHttpSetOption(hTempRequest,&WINHTTP_OPTION_SEND_TIMEOUT,&&dwData,&dwSize)设置请求超时时间50s,但WinHttpSendRequest总还是在默认的30秒返回。(为了测试网络状况不好的情况,特意限制的程序的上传速度让其在超时之前无法上传成功)使用::WinHttpSetTimeouts却可以得到期待的结果。
WINHTTP_OPTION_CONNECT_TIMEOUT
WINHTTP_OPTION_RECEIVE_TIMEOUT
也设置一下看看能不能得到预期结果
Q 对于一个TCP长连接来说,&只要连接没有断开,正确的命令是一定可以收到Server的回复的。
但是网络状况不佳的情况下,不可能永远等待server的回复,通常会设置一个超时时间,一旦超过一定时间,就会认为失败。对于短连接来说,只要简单的断开连接就可以了,但是长连接的话,一般处理方式就是无视server返回的结果,如果server在超时时间后返回结果,直接丢弃。如果是一个读取数据的操作,这样做没有任何问题。
现在问题是,如果我有一个写操作命令发送给Server了,但是超过时间没有响应,应该怎么处理?比如说更改用户密码的命令,长连接是不能断开连接的,这时该怎么处理?(就算是短连接,是否也存在超时返回失败,但是实际密码已经更改成功的情况?)
个人想到的有:(1)若Server处理完密码更改任务完成后,还没发response,连接就因为网络异常断开了,似乎是无解,这个可以暂不考虑。所以以下都是不考虑网络中途异常断开的情况。
(2)超时后,发送cancel指令给server,取消密码更改命令,不过这会大大增加Server程序的复杂度,至少需要缓存之前的旧密码,cancel指令什么时候能达到server也是个问题,server上总不能无期限的保存这个旧密码吧。
(3)写操作不做超时机制,改成异步,一直等到结果返回为止,并且在结果返回前不允许再发送这个写操作命令。不过体验比较差,相当于一段时间内禁用了某功能。
针对你上面这贴说的这种情况,如果是我,我就针对这种超时的请求,在下次发命令前先到服务器查询一下,如果上次执行成功,就不再重复发送
但是下次命令与上次命令参数可能是不同的,server怎么判断“上次执行“是哪一次呢?要精确比较的话,server就需要缓存大量的数据,到底要缓存多少条,这些数据要缓存多久也不知道。
不知道你服务端的数据是怎么组织的,这种问题在很多系统都会是严重问题,比如计费系统,玩家充了钱,服务端也成功,但像你说的,客户端没收到回包,就需要客户端和服务器制定协议来处理这种情况。
比如就这个场景下,客户端没有收到回包,应该怎么处理?
1,直接提示操作失败(显然不可取)
2,超时后,不提示失败,而是发送命令查询结果,若查询也超时,则无限发送查询命令,直到成功为止?
3,不设置超时,一直等待回包,直到下次用户查询余额或者打开充值面板的时候,发送一次查询命令?
客户端如果发现超时,就把这种请求上下文放到一个队列,最好是能持久化保存,比如写文件或写数据库,然后立马重发,如果每次重发都收不到回包,那么你的系统所在的网络就有很大问题,这时候就不是担心你程序的问题了,赶紧找负责网络的系统人员解决问题,等网络恢复,从文件和数据库把未决的请求处理掉,重发后,服务器可以根据订单id判断是否已有相同的订单,有的话,直接返回成功。一般来说,这种客户端收不到服务端返回的情况很少,即便碰到,重发个几次总会成功,这期间可能卡个几秒,对玩家来说,也是小概率事件,可以接受
Q public static String getJsonOfArray(String url) throws Exception
&&& {
&&&
String JsonStr =
&&&
if(url.contains("?")){
&&&
url +="&type=m";
&&&
}else{
&&&
url +="?type=m";
&&&
HttpGet httpRequest = new HttpGet(url);
HttpClient client = DefaultClient.getInstance();
client.getParams().setParameter("http.socket.timeout",2000);//设置请求服务器超时时间&& 不起作用
client.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
HttpResponse httpResponse = client.execute(httpRequest);
if (httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
JsonStr = EntityUtils.toString(httpResponse.getEntity());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
Log.i("XX","---JsonStr---"+JsonStr);
&&&&&&& return JsonS
A 我的,希望有用
public class GetJsonData {
public static String getConnectionData(String url) {
StringBuilder sb=new StringBuilder();
HttpClient client=new DefaultHttpClient();
HttpParams params=client.getParams();
HttpGet get=new HttpGet(url);
HttpResponse response=client.execute(get);
HttpConnectionParams.setConnectionTimeout(params, 3000);
HttpConnectionParams.setSoTimeout(params, 5000);
HttpEntity entity=response.getEntity();
if(entity!=null){
BufferedReader reader=new BufferedReader(new InputStreamReader(entity.getContent(),"utf-8"),8192);
String line=
while((line=reader.readLine())!=null){
sb.append(line+"\n");
reader.close();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
return sb.toString();
Q def ajax_test
if request.xhr?
render :update do |page|
page.alert("xhr");
elsif request.post?
render :update do |page|
page.alert("post");
页面上是表单发送一个ajax请求:
&% form_remote_tag :url =& {:action =& "ajax_test", :id =& @user }, :before =& "$('submit_btn').disable();$('loading').show()"& do %&
&% end %&
测试结果是弹出xhr,很正确!不过....
def ajax_test
if request.post?
render :update do |page|
page.alert("post");
elsif request.xhr?
render :update do |page|
page.alert("xhr");
测试的结果是post。
我的rails版本是rails 2.0.2 (都有点不好意思拿出来了... )
你们看一下新版本会有这个bug吗?
A 佩服你直接质疑是Rails BUG的勇气, 但不得不告诉你, 这是你的问题.
# Generates:
&form action="/some/place" method="post" onsubmit="new Ajax.Request('',
{asynchronous:true, evalScripts:true, parameters:Form.serialize(this)});"&
form_remote_tag :html =& { :action =&
url_for(:controller =& "some", :action =& "place") }总是连接服务器超时
总是连接服务器超时
(C)2017 列表网&琼ICP备号-12&增值电信业务经营许可证B2-&

参考资料

 

随机推荐