【前言】在我们的struts2后端中,实现流的接收和发送。就能够实现向server传视频流以及下载图片。

【流接收】

如今举一个传公钥的样例。struts2用一个action接收Key,而Key就是用http二进制流传过来的。

配置文件struts.xml写起来非常easy:

<action name="key" class="com.seeplant.action.PublicKeyAction" method="key">

<result>/WEB-INF/content/SUCCESS.jsp</result>

<result>/WEB-INF/content/ERROR.jsp</result>

</action>

仅仅是简单的指定了用Public String key()方法来处理这个Action,Action中用Servlet的Request读出流

public class PublicKeyAction extends ActionSupport {

public String key() {

try (ObjectInputStream oStream = new ObjectInputStream(ServletActionContext.getRequest().getInputStream());) {

java.security.Key publicKey = (Key) oStream.readObject();

System.out.println("公钥\n"+publicKey);

} catch (Exception e) { e.printStackTrace();}

}

}

为了配合測试,贴上client发请求的代码。

public class MyTest {

    private final static int KEYSIZE = 512;

    private final static String kurlstring = "http://127.0.0.1/key";

    public static void main(String[] args) {

        try {

            URL url = new URL(kurlstring);



            URLConnection uConnection = url.openConnection();

            uConnection.setRequestProperty("content-type", "application/octet-stream");
//注意这里的content-type,一定要按规范写

            uConnection.setDoOutput(true);

            OutputStream oStream = uConnection.getOutputStream();

// 生成Key

            KeyPairGenerator pairGenerator = KeyPairGenerator.getInstance("RSA");

            SecureRandom random = new SecureRandom();

            pairGenerator.initialize(KEYSIZE,random);

            KeyPair keyPair = pairGenerator.generateKeyPair();



            try (ObjectOutputStream out = new ObjectOutputStream(oStream);){

                out.writeObject(keyPair.getPublic());

                out.flush();

            } catch (Exception e) {

                // TODO: handle exception

                e.printStackTrace();

            }



            uConnection.getInputStream();



        } catch (MalformedURLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (NoSuchAlgorithmException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

【流发送】流发送一般用于server公布流媒体。像中文名的图片就能够用流发送的方式提供,而不用改动tomcat的配置

struts.xml中,相应的流发送Action要配置成stream模式

<action name="download" class="com.seeplant.action.AndroidAppDownload">

<param name="inputPath">/WEB-INF/androidVersion/SeePlant.apk</param>
<!-- 这里指定了源文件的路径,在action类中有一个inputPath属性-->

<result type="stream">

<!--这里要指定content Type-->

<param name="contentType">application/vnd.android.package-archive</param>

<!--这个inputName一定要有,他是框架默认的入口函数标示,这里定义了一个targetFile,structs在收到client请求的download.action之后,会定位到getTargetFile函数。细致体会一下这里的相应关系-->

<param name="inputName">targetFile</param>

<!-- 这里是设置client收到的文件名称 ,client将会看到将要打开一个叫做SeePlantPack.apk的文件 -->

<param name="contentDisposition">filename="SeePlantPack.apk"</param>

<param name="bufferSize">4096</param>

</result>

Action非常easy

public class AndroidAppDownload extends ActionSupport {

private String inputPath;

public void setInputPath(String inputPath) { this.inputPath = inputPath;}

// 注意这里的入口方法的返回值是InputStream接口类型

public InputStream getTargetFile() throws Exception {

return ServletActionContext.getServletContext().getResourceAsStream(inputPath);

}

}

【struts2】struts2中的流接收与流发送的更多相关文章

  1. Linux网络中接收 "二进制" 流的那些事 --- 就recv的返回值和strlen库函数进行对话

    1.    前言 很多朋友在做网络编程开发的时候可能都遇到这样的问题,在进行接收二进制流的数据的时候,使用strlen库函数来得到 二进制数据长度的时候并不准确.为什么呢??首先,使用strlen进行 ...

  2. java中的序列化流和反序列化流

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 } 序列化流:把对象按照流一样的方式存入文本文件 ...

  3. 通过http请求传递xml流和接收xml流的代码示例

    通过http请求传递xml流和接收xml流的代码示例 //1.在servlet中post一个xml流:import java.io.OutputStreamWriter;import org.jdom ...

  4. ffmpeg接收rtsp流问题

    项目使用mingw环境g++5.3,C++调用ffmpeg接收rtsp流,再通过C#显示.结构上是C#调用C++的so文件,读取得到的视频帧(RGB888格式),通过图片控件显示. 一开始是使用ope ...

  5. Java中使用try-catch-finally处理IO流中的异常

    我们使用try-catch-finally来接收IO流的异常 finally是最后执行的步骤,非常适合最后存放close来关闭IO流,而且编程中我们不可以随意抛出异常,必须对异常进行处理. 从try- ...

  6. ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案

    摘要: ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案 在struts2应用中使用ueditor富文本编辑器上传图片或者附件时,即使配置 ...

  7. 请求在Struts2框架中的处理步骤

    上图来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 ...

  8. struts2配置文件中action的name属性

    struts2配置文件中action的name属性的第一个字符不要加斜杠 <action name="see" class="baoxiuManage_seeAct ...

  9. C++中输入输出流及文件流操作笔记

    1.流的控制 iomanip          在使用格式化I/O时应包含此头文件.    stdiostream   用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序 2.类 ...

随机推荐

  1. asp.net core 2.1开发环境下配置IIS

    asp.net core 2.1是可以在开发环境下配置到IIS中的,这样就可以在vs中按F5直接运行了 在项目上右键点击属性,然后在Debug中配置如下参数 首先点击New按钮,输入IIS,点击确定 ...

  2. PHP 7给我震撼

    看了一些php7(ng)的讨论,目前还没有去下beta版尝试编译. 作为一个phper,一直都有关注php本身语言的发展.以前在jumei工作的时候就听罗sir谈到过php ng,性能将超过faceb ...

  3. angularjs1--动画

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  4. ThinkPHP5+Redis单例型购物车

    <?php /** * Redis + 单例型购物车 * param $basket 存储商品信息 * param $ins 存储实例化对象 */ namespace lib; use redi ...

  5. 写函数,输入n个数字输出最大值和最小值

    # ,写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}# 例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此题用到max(),min()内置 ...

  6. POJ 3628 01背包 OR 状压

    思路: 1.01背包 先找到所有奶牛身高和与B的差. 然后做一次01背包即可 01背包的容积和价格就是奶牛们身高. 最后差值一减输出结果就大功告成啦! 2. 搜索 这思路很明了吧... 搜索的确可以过 ...

  7. 制作ubuntu的U盘启动盘

    在制作U盘启动盘之前,请各位先格式化你的U盘. 制作U盘启动盘的工具有很多种,我们这里为大家介绍的是用软碟通制作.所有我们需要有这个软件,如果大家没有可以百度“软碟通”,下载安装一个.然后点击打开.在 ...

  8. [转] Java 插入表记录后得到自增的id (附3种方法代码)

    转自:https://blog.csdn.net/yaerfeng/article/details/7231093 在MySQL中,使用auto_increment类型的id字段作为表的主键,并用它作 ...

  9. Win32 CRT and MFC 清单文件.manifest配制

    Demo.exe.manifest <?xml version="1.0" encoding="UTF-8" standalone="yes&q ...

  10. T7314 yyy的巧克力(钟)

    题目描述 输入输出格式 输入格式: 如图 输出格式: 如图 输入输出样例 输入样例#1: 如图 输出样例#1: 如图 说明 如图 n*m-1 我们可以这样想,1*1的巧克力一定是由1*2的掰开的 #i ...