对于网络请求相关的异常,抓包是一个很有效的方法,要习惯于抓包,而不是单纯地打印日志。日志能看到的是我们预想的,抓包抓到的则是意外的我们预想不到的。比如在实际生产中,常常出现程序异常崩溃的情况,这个时候往往日志是来不及记录的,如果这个崩溃是网络请求导致的,这个时候你用抓包工具,就很容易定位到问题原因。比如之前我一个同事写的程序总是在服务器停止几秒钟后崩溃,我们看了所有的日志,研究了windows的日志记录器,都未能找出有用的信息,后来我们想既然是服务器引起的,那么抓包应该是没问题的,就尝试了一下。最终我们发现他写的程序在每隔几秒钟就往服务器请求一次接口,这是他用来做心跳用的。但是他的源码并没有对这部分代码try...catch...。他是在程序的最上层进行的try...catch...。但他这个心跳是在一个子线程里面,这就导致catch不到任何异常,一旦服务器停止了,他的网络请求就会异常,导致程序崩溃。比如下面的代码:
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
try
{
Thread thread = new Thread(() =>
{
throw new Exception();
});
thread.Start();
}
catch (Exception ex)
{
}
Console.ReadLine();
}
这种情况不管是在java中还是在c#中都是如此,主线程catch不到子线程的异常。
我们当时用的抓包工具是Wireshark,还有另外一个抓包工具Fiddler,但是它好像只能抓http的包,我很少用它。使用wireshark有可能会出现找不到接口的情况,大部分情况下,通过安装WinPcap都能解决,下载网址:https://www.winpcap.org/install/default.htm
打开之后界面如下:
这个是我的电脑能够抓到的接口,只有以太网这一个。双击它,可以看到具体的网络请求信息:
工具的使用网上有很多教程,这里就不赘述了,只说几个有用的过滤条件。一般我们都是抓指定地址的指定端口和指定协议的包,那么这个过滤该怎么写呢,如下:
ip.dst==112.80.248.75 and ip.src==127.0.0.1 and http and tcp.port==80 and tcp.srcport==8080
上面的意思是过滤出目标地址为112.80.248.75,请求地址为127.0.0.1,且端口为80,且源端口为8080的所有http请求,当然了,这样写出来的过滤条件是冲突的,这里只是为了演示所有的常用命令,所以全部列出来了。