这几天小编在工作中遇到了一个灵异事件,客户端使用的是Android/ target=_blank class=infotextkey>安卓原生系统,服务端使用的是JAVA 。需求就是客户端在照相的时候可以实时上传照片 。后台接收并保存,并且可以在平台上显示 。看似简单的功能,确有个很大的坑 。有2个平台,192.168.31.87平台是测试环境,192.168.31.239是演示环境,测试环境,演示环境,还有安卓客户端代码都是一样的,连mq,redis,Nginx,数据库都是一样的 。但是安卓端上传测试环境一直报java.net.SocketException,在演示环境上是正常的 。检查服务端代码 。我首先用了postman进行测试.
文章插图
由于已经上传过一张一样的照片,所以这里返回failed,但是请求是200.说明是调用正常 。然后我在微服务上写了个测试类,用httpclient调用结果也是正常 。
文章插图
在安卓客户端上传的时候,正常和不正常的log分别是
正常:response-->Response{protocol=http/1.1, code=200, message=OK, url=http://192.168.31.239:8081/api/collDataUpload?para={%22fileName%22:%2220180822_185110_523.jpg%22,%22pno%22:%2220180821%22,%22dkey%22:%2215948c07-c718-4f32-a0af-4b7841fa95a0%22,%22stime%22:%221534935070523%22,%22etime%22:%221534935071000%22}}不正常:response-->Response{protocol=http/1.1, code=400, message=, url=http://192.168.31.87:8081/api/collDataUpload?para={%22fileName%22:%2220180822_184559_902.jpg%22,%22pno%22:%228230%22,%22dkey%22:%22d351aa68-bace-438f-8d08-89ff598d4e04%22,%22stime%22:%221534934759902%22,%22etime%22:%221534934760000%22}}安卓客户端部分代码
/** * 同步基于post的图片上传 * * @param url * @param file * @return */ public Response uploadPic(String url, File file, String fileName) throws IOException { MultipartBody.Builder builder = new MultipartBody.Builder(); builder.setType(MultipartBody.FORM); Log.i("huang", "files[0].getName()==" + files[0].getName()); //第一个参数要与Servlet中的一致 builder.addFormDataPart("file", fileName, RequestBody.create(MediaType.parse(guessMimeType(fileName)), file)); MultipartBody multipartBody = builder.build(); Request request = new Request.Builder().url(url).post(new ProgressRequestBody(multipartBody, listener)).build(); okHttpClient.newCall(request).enqueue(callback); }服务端
文章插图
然后客户端调用服务端连这个接口都没进来,首先我判断配置文件是否有对文件大小进行过滤,然后看了filter也没什么 。百思不得奇解 。于是做了很多操作 。虽然最后问题还是没=解决,但是到get到了很多新技能 。
非常重要的一个技能:抓包 。
···
大致步骤为:
1.首先在linux服务器上执行指令
2.调用接口,然后执行指令把linux文件下载到本地
3.使用Wireshark查看日志
需要使用的linux命令
netstat -tupln | grep 5088
tcpdump -i any -p -s 0 -w /tmp/cap.pcap
sz /tmp/cap.pcap
···
文章插图
文章插图
文章插图
然后到开始菜单换中打开
文章插图
Wireshark这软件,小伙伴百度下载即可
地址栏中可以输入过滤条件:
ip.addr == 192.168.31.182 and http
文章插图
选中其中你想看的包,右键追溯流--->TCP流或者http流
文章插图
这里大致解释一下:
Content-Type:是上传文件格式multipart/form-data是指图片 。
boundary=XXXX,这是前端传的时候使用的一种形式addBoundary
Content-Length是内容大小
Host:是服务器主机地址
Connection是链接状态
Accept-Encoding是接收的编码格式
User-Agent:是用户上传的形式,这里安卓使用的是okhttp/3.6.0
content-Desposition是上下文的描述
content-Type:内容类型
很开心,又get到了一个新技能,但是我的问题还是没有解决 。目前的解决办法就是自己在写个安卓端,单独用做个按钮,然后用okhttp上传文件到平台 。
另外在操作安卓的时候遇到了adb.exe已停止工作,然后开启不了虚拟机的问题 。
推荐阅读
- 快速祛痘方法
- 如何快速练大胸肌?
- 应该如何快速锻炼腹肌和胸肌呢?
- 热瑜伽帮你快速排毒减重
- 掌握新陈代谢规律 燃脂更快速
- 淘宝直播如何快速增加亲密度,视频 淘宝直播间亲密度怎么提升
- Spring框架中的国际化支持
- MIUI12快速体验,真的媲美ios?
- 格力回应招标作假;诺基亚指控联想侵权;小米开发5G手机处理器
- 微信小程序云开发,不借助额外服务端爬虫实现小说阅读小程序