如何截取服务器返回码
⑴ 在jsp页面怎么获取服务器返回的状态码
java"><%=response.getStatus()%>
${response.getStatus()}
⑵ 如何侦服务器的tcp返回数据
在平时的开发中,经常会碰到一些需要检测tcp连接是否正常的场景。比如一个分布式的应用,一个调度任务的节点管理一堆用来跑业务的节点。当调度节点进行调度的时候,需要把任务分发给它认为正常的业务节点去执行。业务节点是否正常,一个重要的参考依据就是调度节点和业务节点之间的tcp连接是否正常。这时候就需要调度节点主动地去检测tcp连接。常见的检测方法有以下几种
方案一、通过TCP协议的返回值进行判断
<1> 利用select,把socket设置为非阻塞。然后使用select等待该socket的可读事件。如果socket可读,但是recv的返回值是0,则说明socket已经被对端断开,这时候就可以调用close关闭socket。这里还要注意一点,recv还可能返回负数,这个代表socket操作出错。但是仍然应该判断一下errno是否为EINTR。如果errno是EINTR,则说明recv函数是被信号中断返回的,这时候不能判断socket的连接是否正常,也不应该调用close关闭socket。
<2> 利用poll的事件。poll本身提供了POLLHUP,POLLERR, POLLNVAL三个事件。如果文件描述符是socket,则POLLHUP代表socket已经断开了连接,在TCP底层就是已经收到了FIN报文。POLLERR表示socket出现了错误,一般情况下是收到了rst报文,或者已经发送了rst报文。这两种情况都应该调用close关闭socket。POLLNVAL代表socket没有打开,这时不能使用close关闭它,而应该根据自己的业务做一些其他的操作。因为关闭一个未打开的socket会出错。
这两种方法都可以很精确地判断tcp连接是否正常,但是仍然有很明显的缺陷。就是它只可以根据TCP操作的返回值来进行判断。如果TCP四次握手没有正常被执行呢?比如连接对端机器直接挂了,那么就不会发送FIN报文给这一端,select不会返回socket可读,poll不会返回socket异常。那么这个死链接将会永远检测不到。直到写这个socket的时候,对端直接返回一个ret报文,这时才知道这个连接已经断掉了。这就意味着tcp连接异常可能永远检测不到,或者检测到的延迟非常大。这对于一些资源宝贵而且要求高性能的服务器是不能接受的,比如游戏服务器,比如搜索服务器。方案二、在第一种方案的基础上设置socket的 keep alive 机制
方案一的主要缺陷在于检测不及时,或者根本检测不到。TCP协议提供了keep alive机制。如果开启了这个特性(暂时称开启了keep alive的一端为开启端),在默认情况下,开启的着一端的socket相关结构中会维护一个定时器,默认是2小时。如果在2小时内两端没有数据往来,那么开启端就会给另一端发送一个ack空报文。这时候分几种情况:
<1> 对端机器可达,而且TCP相关组件运行正常。那么对端就会给开启端发送一个ack空报文。这时开启端就知道对端是正常的,意味着tcp连接也没有问题。开启端会重新初始化定时器,等待下一个超时的到来。需要注意的是,如果两端之间有数据往来,定时器也会被重新初始化为2个小时。
<2> 对端挂了,或者正在重启,还没有完全起来。或者对端服务器不可达。 这种状态的对端是不会响应这个ack的。开启端的 keep alive 机制会把这种情况当探测超时来处理,并且重新发送ack到对端。当超时次数超过一定限制,keep alive 就认为这个tcp连接有问题。典型值是每次75秒,超时9次。
<3> 对端挂过,但是已经重启完成。这时候发送这个ack和写已经关闭的socket是一种情况,对端会返回一个rst报文,这样开启端就知道tcp连接出问题了。
可以看出 keep alive 机制弥补了方案一种不能判断没有进行正常四次挥手连接出现问题的缺陷。默认的发送超时和发送间隔都是可以调整的。
tcp_keepalive_time: KeepAlive的空闲时长,默认是2小时
tcp_keepalive_intvl: KeepAlive探测包的发送间隔,默认是75s
tcp_keepalive_probes: 在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包次数,默认是9次
这3个参数使用 setsockopt函数都是可以配置的。
方案二看似已经完美了,能够比较精确而且及时地发现有问题的连接。但是还有2个缺点。第一个是 keep alive 机制看似牛逼,但是很多人不建议使用。因为上面说的3个参数很难根据业务场景给出合适的值,设置不好很容易对tcp连接状态发生误判,关闭了一个本来正常的连接。而且没有一个主动通知应用层的方式。比如socket连接出错了,TCP协议接到了rst,fin,或者keep alive判断出socket有问题了,但是并不会主动去通知应用层,必须我们自己 recv socket或者等待错误事件才能得到这个错误。第二个是很多场景下,keep alive 检测仍然不够及时,比如对端挂了,最长需要等待 tcp_keepalive_intvl * tcp_keepalive_probes时间才可以检测出来,而且这两个值还不能设置得太小,太小了容易误判。
方案三、应用层的心跳
这种形式的心跳设计就比较多样化了,而且灵活,可以很好地适应业务场景。唯一的缺点就是要自己写代码。我目前接触到的就是定期进行RPC调用。看RPC调用是否正常,如果返回错误或者抛出异常,就说明连接有问题。
⑶ 如何使用Retrofit获取服务器返回来的JSON字符串
如何使用Retrofit获取服务器返回来的JSON字符串
以下是我们在Api接口中的定义方法
//以前我们使用我们定义好的POJO或javabean类作为callback的泛型,以便Retrofit帮我们解析
@POST("/interface/xxxxxx")
void getCouponList(Callback<Coupon> reponse);
//但如果我们想获得JSON字符串,Callback的泛型里就不能写POJO类了,要写Response(retrofit.client包下)
@POST("/interface/xxxxxx")
void getCouponList(Callback<Response> reponse);
那么在我们请求接口的时候,只需简单一行代码,就能拿到服务器返回的JSON字符串了
ZhixueApiUtil.getInstance().getZhixueApi().getCouponList(new Callback<Response>() {
@Override
public void success(Response response, Response response1) {
//注意这里用第一个Response参数的
String jsonString = new String(((TypedByteArray) response.getBody()).getBytes());
//再使用Retrofit自带的JSON解析(或者别的什么)
Coupon coupon = new Gson().fromJson(jsonString, Coupon.class);
......
}
@Override
public void failure(RetrofitError error) {
......
}
});
至此,我们就能拿到JSON字符串了,在需要的时候可以用这种办法。
⑷ chttpfile->sendrequest get如何获取服务器返回
CString strSentence, strWriteName="1.htm"; CString strFileName="http://localhost/InDesign/" + strWriteName; CInternetSession sess; CHttpFile* fileGet; try { fileGet=(CHttpFile*)sess.OpenURL(strFileName); } catch(CException* e) { fileGet = 0; throw; } if(fileGet) { DWORD dwStatus; DWORD dwBuffLen = sizeof(dwStatus); BOOL bSuccess = fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen); if( bSuccess && dwStatus>= 200&& dwStatus<300 ) { CStdioFile fileWrite; if(fileWrite.Open(strWriteName, CFile::modeWrite|CFile::modeCreate)) { while(fileGet->ReadString(strSentence)) { fileWrite.WriteString(strSentence+"\n"); } fileWrite.Close(); AfxMessageBox("下载完毕"); } else { AfxMessageBox("本地文件"+strWriteName+"打开出错."); } } else { strSentence.Format("打开网页文件出错,错误码:%d", dwStatus); AfxMessageBox(strSentence); } fileGet->Close(); delete fileGet; } else AfxMessageBox("不能找到网页文件!"); sess.Close();
⑸ 网络中如何截取数据包修改后返回服务器
截取数据包可以仿照sniffer的方法,将把网卡置于混杂模式(Raw Socket)的方法,然后抓包,分析……
另外你的网络流量监控系统是监控链路还是监控节点,监控节点的话直接访问注册表就可以了(windows),如果是监控整个网络环境的话可参考icmp协议的使用。
⑹ 如何从FTP服务器返回信息中将IP和端口号提取出来
无知一点,处理这符串
不过似乎有点什么类port,你查一下
⑺ 易语言客户端发送数据给服务器,服务器返回的信息怎么去返回提取,比如服务器返回152,0,1,0,0,19,0,0,152
发送的是字节集,取回数据()也是返回字节集啊,也就是字节型数组{152,0,1,0,0,19,0,0,152}.如果发送的是文本那可以这样
编辑框1.内容=到文本(客户1.取回数据())
⑻ 如何使用fiddler截取自己要测试的网址
方法/步骤
1、进行打开电脑中已经安装好的fiddler的软件工具,进入到界面中之后,进行点击右边的位置中的“composer”的选项。
2、进入到了composer 的选项之后,在parsed中进行根据http发送进行选择请求,这里是http的协议的get请求,进行选择为get。
3、使用网络一下链接地址,把链接地址复制到地址栏的输入框的位置中。
4、然后进行点击execute的按钮进行发送http的协议请求操作。
5、在fiddler的位置中可抓取的http协议发送的服务器返回的操作的内容。进行双击抓取的http链接。
6、需要查看服务器返回内容,进行点击textview可以查看具体内容信息。
⑼ javascript截取服务器返回信息
简单的说下流程吧
一般都是ajax请求,在onerror函数里处理下,或这在onsuccess函数中判断下响应的状态码,如5xx系列就是服务内部错误,这时你就可以按你的想法向做什么就做什么了。
⑽ ios 服务器返回错误码怎么拿到
ios向服务端发起请求报错:内部服务器错误 (500),有需要的朋友可以参考下。
ios端运用AFHTTP框架向服务端发起请求,但是报错:
<span style="font-size:10px;">Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: 内部服务器错误 (500)" UserInfo=0x17f95580 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x17daddb0> { URL: http://192.168.1.68/Interface/MessageService.asmx/RegNewsLog } { status code: 500, headers {
"Cache-Control" = private;
"Content-Length" = 28;
"Content-Type" = "text/plain; charset=utf-8";
Date = "Mon, 23 Mar 2015 01:40:47 GMT";
Server = "Microsoft-IIS/7.5";
"X-AspNet-Version" = "4.0.30319";
"X-UA-Compatible" = "IE=EmulateIE7";
"content-script-type" = "text/javascript";
"content-style-type" = "text/css";
} }, NSErrorFailingURLKey=http://192.168.1.68/Interface/MessageService.asmx/RegNewsLog, NSLocalizedDescription=Request failed: 内部服务器错误 (500), com.alamofire.serialization.response.error.data=<e7bcbae5 b091e58f 82e695b0 3a204c6f 6e676974 756465e3 80820d0a>}
</span>
查找原因:
a、一开始以为是传回来的格式不正确,默认是传回json数据的,但是我调用的这个方法返回的是字符串数据。所以将服务端返回的数据改成json,还是出错。
b、将服务端的后台代码全都注释,排除是否因为服务端的代码出错,导致返回失败。整个函数直接返回一个json字符,还是报错,
c、那就是入参的问题了,查看传入参数的名称,发现服务端的其中一个参数名称为:Longitude,但是我传过去的是Longtitude,就差了一个t,导致了服务端不认传过来的参数所以报错。
总结:
1、以后进行服务端请求时,应该完全把服务端的入参名称粘贴过来就可以了,不要自己写。容易造成不一致(不一定哪端没写对)
2、服务端报错不一定全都是服务端的原因,完全有可能是客户端的入参有问题,导致服务端出错。