关于从URLConnection获取流的顺序问题

今天写一段代码,向服务器发送一段报文,然后获取服务器的响应

其中发送报文的代码如下:

//...
outputStream = connection.getOutputStream();
inputStream = connection.getInputStream();

PrintWriter outPrintWriter = new PrintWriter(outputStream);
outPrintWriter.print(params);
outPrintWriter.flush();
//...

运行起来之后发现连接是建立起来了,但是服务端什么也没收到。抓包一看,客户端这边根本没发请求报文,只是建立了一个链接。

对照网上的例子看了半天,不知道问题出在哪里。

查到最后,发现,如果把输入流的获取放在发送报文的逻辑之后,那么报文就可以发送出去。代码如下:

//...
outputStream = connection.getOutputStream();

PrintWriter outPrintWriter = new PrintWriter(outputStream);
outPrintWriter.print(params);
outPrintWriter.flush();

inputStream = connection.getInputStream();//放到了发送报文之后
//...

这样,报文就可以发送出去了。

对于这其中的原理,我不明白。

如果有了解Servlet运行机制的朋友,请指点一二,我将万分感激。

时间: 2024-07-30 23:58:14

关于从URLConnection获取流的顺序问题的相关文章

RecursiveTask和RecursiveAction的使用 以及java 8 并行流和顺序流(转)

什么是Fork/Join框架        Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过Fork和Join这两个单词来理解下Fork/Join框架,Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果.比如计算1+2+..+10000,可以分割成10个子任务,每个子任务分别对1000个数进行求和,最终汇总这10个子任

解决在Filter中读取Request中的流后,后续controller或restful接口中无法获取流的问题

首先我们来描述一下在开发中遇到的问题,场景如下: 比如我们要拦截所有请求,获取请求中的某个参数,进行相应的逻辑处理:比如我要获取所有请求中的公共参数 token,clientVersion等等:这个时候我们通常有两种做法 前提条件是我们实现Filter类,重写doFilter方法 1.通过getParameter方法获得 HttpServletRequest hreq = (HttpServletRequest) req; String param = hreq.getParameter("pa

httpWebRequest获取流和WebClient的文件抓取

昨天写一个抓取,遇到了一个坑,就是在获取网络流的时候,人为的使用了stream.Length来获取流的长度,获取的时候会抛出错误,查了查文档,原因是某些流是无法获取到数据的长度的,所以不能直接得到.如果是常和stream打交道就能避免这个问题.其实直接使用do-while来获取就行了,代码如下: int i=0; do { byte[] buffer = new byte[1024]; i = stream.Read(buffer, 0, 1024); fs.Write(buffer, 0, i

C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!

最近开发了基于C#的推流器一直不大理想,终于在不懈努力之后研究了一点成果,这边做个笔记:本文着重在于讲解下如何使用ffmpeg进行简单的推流,看似简单几行代码没有官方的文档很吃力.并获取流的源代码:如下→ #region RTMP推流(**已成功推流至服务器**) Network.Create() .WithSource(inputPath)//inputPath可以改成获取设备的视频流 .WithDest("rtmp://192.168.61.128/live/livestream"

排序并获取index的顺序

//排序并获取index的顺序:4,7,2,9-->9,7,4,2-->4,2,1,3 Array.prototype.getIndex=function(){ var orderLength = this.length; var temp,tp; var c=[]; for(var l=0;l<orderLength;l++){ c[l]=l; } for(var u=0;u<orderLength;u++){ for (var v=0;v<orderLength-u-1;

java8新特性——并行流与顺序流

在我们开发过程中,我们都知道想要提高程序效率,我们可以启用多线程去并行处理,而java8中对数据处理也提供了它得并行方法,今天就来简单学习一下java8中得并行流与顺序流. 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流. Java8中将并行流进行了优化,我们可以很容易的对数据进行并行操作.Stream API可以声明性地通过parallel()与scqucntial()在并行流与顺序流之间进行切换. 一.Fork-Join框架 Fork-Join框架:是java7提供

Maya cmds pymel 获取安装选择顺序选择的物体

Maya cmds pymel 获取安装选择顺序选择的物体 import maya.cmds as cmds 先设置选择顺序 cmds.selectPref(trackSelectionOrder = 1) 然后选择物体 然后运行 sels = cmds.ls(os = 1) 那么sels就是一个list,里面的物体是安装选择顺序来排列的 最后可以把选择顺序关闭 cmds.selectPref(trackSelectionOrder = 0) 原文地址:https://www.cnblogs.c

Cout vs printf---缓存与引用,流处理顺序(转ithzhang,知乎郝译钧)

一个知乎问题: VS2013,debug模式int i = 4;cout << i++ << i++ << endl;输出结果:54int i = 4;cout << ++i << ++i << endl;结果输出:66同样类似的问题出现在如下函数中void myFun(int i1, int i2) {cout << i1 << i2;}从右往左的结合性我理解..但是为什么一个是54,一个是66?满地打滚求解

使用URLConnection获取页面返回的xml数据

public static void main(String[] args) throws Exception { String path="http://flash.weather.com.cn/wmaps/xml/hubei.xml"; URL url = new URL(path);//获得url对象 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //创建URLConnection连接 conn