精华内容
下载资源
问答
  • 多媒体消息存储器是一个永久的储存中心,可以保存从多媒体消息中接收到的或由用户自己创作的图片、视频、音频片段;灵活的实时计费体系;报告和分析服务数据的商用工具;用于西门子与第三方多媒体应用的扩展序列,它...
  • 这次想分享的是使用mina框架自定义编解码器,实现发送纯文本和非纯文本消息,带PBE加密。  首先定义要发送的信息包,之前一直想用mina进行图片语音,短视频的传送,把多媒体信息封装成一个类,纯文本文件封装成一个...

           首先,对于mina的基本使用这里就不多说了,之前已经转载了一篇很详细的说明。这次想分享的是使用mina框架自定义编解码器,实现发送纯文本和非纯文本消息,带PBE加密。

           首先定义要发送的信息包,之前一直想用mina进行图片语音,短视频的传送,把多媒体信息封装成一个类,纯文本文件封装成一个类。然后使用多路分离解码器,虽然这种方法可行,但是发送和接收都直接跳过了handler这层。到最后处理业务逻辑很不方便。

           然后尝试值使用一种格式的信息类,消息类型只有是纯文本或非纯文本的标识。一个String类型,真实发送时是发送JSON数据。然后一个byte数组。当是纯文本信息是,标识是'+',byte数组为null,这里不会造成new 一个信息类就会分配多余的内存。当时非纯文本信息时,标识是'-'。byte数组存放多媒体信息。

           接下来重要的环节就是编写编码器和解码器,思想很简单,根据发送的信息标识进行相应的编码,根据标识进行相应的解码。然后就是加密,这里用到的是PBE对称加密。加密时机是编码器编码时。解密就是在解码器解码时。加密速度我测试了一下。4.1M 加密:191ms 解密:198ms   15M  加密: 600ms    解密:570ms,应该还可以了。

           接下来附上代码:

    1.信息类

           /**
     * symbol = '+' : 纯本文件
     * symbol = '-' : 非纯本文件
     * @author Administrator
     */
    public class iMoMoMsg {
     public char symbol;//判断是否是纯文本文件
     public String msgJson;//包含图片详情的解释
     public byte[] msgBytes;//图片
    }

     

    2.编码类

    package com.imomo_codecfactory;

    import java.nio.charset.Charset;
    import java.nio.charset.CharsetEncoder;

    import org.apache.commons.codec.binary.Base64;
    import org.apache.mina.core.buffer.IoBuffer;
    import org.apache.mina.core.session.IoSession;
    import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
    import org.apache.mina.filter.codec.ProtocolEncoderOutput;

    import com.imomo_msg.iMoMoMsg;
    import com.security.PBE;

    public class iMoMoEncoder extends ProtocolEncoderAdapter {
     CharsetEncoder encoder = Charset.forName("utf-8").newEncoder();
     // 纯文本发送格式:头标记(char) + 信息长度(int) +文本信信息(加密byte[])
     // 非纯文本发送格式:头标记(char) + 文字信息长度(int) + 文字信息(加密byte[]) + 多媒体信息长度(int) + 多媒体信息(加密byte[])
     @Override
     public void encode(IoSession session, Object msg, ProtocolEncoderOutput out)
       throws Exception {
      iMoMoMsg moMsg = (iMoMoMsg) msg;
      char symbol = moMsg.symbol;
      try {
       if (symbol == '+') {
        byte[] msgJsonByte = PBE.enCrypt(moMsg.msgJson.getBytes());//加密
        System.out.println("--发送文本信息   = " + moMsg.msgJson);
        int msgLen = msgJsonByte.length;
        // 2 :最开始的头部symbol,这里是'-+ ,4表示长度位
        IoBuffer io = IoBuffer.allocate(2 + 4 + msgLen).setAutoExpand(
          true);
        io.putChar(symbol);
        io.putInt(msgLen);
        io.put(msgJsonByte);
        io.flip();
        out.write(io);
       } else if (symbol == '-') {
        byte[] msgJsonByte = PBE.enCrypt(moMsg.msgJson.getBytes());//加密
        byte[] msgBytes = PBE.enCrypt(moMsg.msgBytes);
        System.out.println("--发送多媒体信息 = " + moMsg.msgJson
          + " msgBytesLen = " + msgBytes.length);
        int textLen = msgJsonByte.length;// 文字信息长度
        int msgBytesLen = msgBytes.length;// 图片长度
        IoBuffer io = IoBuffer.allocate(
          2 + 4 + 4 + textLen + msgBytesLen).setAutoExpand(true);
        io.putChar(symbol);
        io.putInt(textLen);
        io.put(msgJsonByte);
        io.putInt(msgBytesLen);
        io.put(msgBytes);
        io.flip();
        out.write(io);
       }
      } catch (Exception e) {
       e.printStackTrace();
      }
     }

    }

    3.解码类

    package com.imomo_codecfactory;

    import java.io.FileOutputStream;
    import java.nio.channels.FileChannel;
    import java.nio.charset.Charset;
    import java.nio.charset.CharsetDecoder;
    import java.util.Date;

    import org.apache.mina.core.buffer.IoBuffer;
    import org.apache.mina.core.session.IoSession;
    import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
    import org.apache.mina.filter.codec.ProtocolDecoderOutput;
    import org.apache.mina.filter.codec.demux.MessageDecoder;
    import org.apache.mina.filter.codec.demux.MessageDecoderResult;

    import com.imomo_msg.iMoMoMsg;
    import com.security.PBE;

    public class iMoMoDecoder extends CumulativeProtocolDecoder {
     CharsetDecoder decoder = Charset.forName("utf-8").newDecoder();

     @Override
     protected boolean doDecode(IoSession session, IoBuffer in,
       ProtocolDecoderOutput out) throws Exception {
      iMoMoMsg moMsg = new iMoMoMsg();
      int pos = in.position();
      int remaining = in.remaining();
      try {
       // 判断长度,开头symbol 是char型
       if (remaining < 2) {
        in.position(pos);
        return false;
       }
       char symbol = in.getChar();// 相当于消费掉字节流
       moMsg.symbol = symbol;
       if (symbol == '+') {
        int msgJsonLen = 0;// msgJson长度
        // 判断是否够解析出的长度
        msgJsonLen = in.getInt();
        if (remaining - 2 < msgJsonLen || msgJsonLen < 0) {
         in.position(pos);
         return false;
        }
        byte[] temp = new byte[msgJsonLen];
        in.get(temp);//得到加密后byte数组
        moMsg.msgJson = new String(PBE.deCiphering(temp));
        out.write(moMsg);
       } else if (symbol == '-') {
        // 接收文本信息
        int msgJsonLen = 0;// msgJson长度
        int msgBytesLen = 0;// msgBytes长度
        msgJsonLen = in.getInt();
        if (remaining - 2 < msgJsonLen || msgJsonLen < 0) {
         in.position(pos);
         return false;
        }
        byte[] temp1 = new byte[msgJsonLen];
        in.get(temp1);//得到加密后byte数组
        moMsg.msgJson = new String(PBE.deCiphering(temp1));
        // 接收图片信息
        msgBytesLen = in.getInt();
        if (remaining - 2 - 4 - 4 - msgJsonLen < msgBytesLen
          || msgBytesLen < 0) {
         in.position(pos);
         return false;
        }
        byte[] temp2 = new byte[msgBytesLen];
        in.get(temp2);//得到加密后byte数组
        moMsg.msgBytes = PBE.deCiphering(temp2);
        out.write(moMsg);
       }
      } catch (Exception e) {
       e.printStackTrace();
       in.position(pos);
       return false;
      }
      return true;
     }
    }

    如果对编解码不熟的可以参考mina开发手册。

    测试 发送15m的视频:

    client handler类里:

    @Override
     public void sessionOpened(IoSession session) throws Exception {
      iMoMoMsg moMoMsg = new iMoMoMsg();
      JSONObject textJson = new JSONObject();
      textJson.put("type", "login");
      textJson.put("id", "201513");
      textJson.put("pwd", "1234");
      moMoMsg.msgJson = textJson.toJSONString();
      moMoMsg.symbol = '+';
      session.write(moMoMsg);

      // 发送图片信息
      JSONObject multiJson = new JSONObject();
      multiJson.put("type", "pic");
      multiJson.put("sender", "001");
      multiJson.put("getter", "002");
      FileInputStream fileInputStream = new FileInputStream("f:\\moshou.avi");
      FileChannel channel = fileInputStream.getChannel();
      ByteBuffer bytebuffer = ByteBuffer.allocate((int) channel.size());
      bytebuffer.clear();
      channel.read(bytebuffer);
      iMoMoMsg moMoMsg2 = new iMoMoMsg();
      moMoMsg2.msgJson = multiJson.toJSONString();
      moMoMsg2.msgBytes = bytebuffer.array();
      moMoMsg2.symbol = '-';
      session.write(moMoMsg2);
      fileInputStream.close();
      channel.close();

     }

    server handler里:

    public void messageReceived(IoSession session, Object message)
       throws Exception {
      super.messageReceived(session, message);
      iMoMoMsg moMoMsg = (iMoMoMsg) message;
      if(moMoMsg.symbol == '+'){
       String msgJson = moMoMsg.msgJson;
       System.out.println("服务器 收到纯文本信息 : " + msgJson);
      } else if(moMoMsg.symbol == '-'){
       String msgJson = moMoMsg.msgJson;
       System.out.println("服务器 收到多媒体本信息 : " + msgJson + "多媒体信息长度" + moMoMsg.msgBytes.length);
       FileOutputStream fileout = new FileOutputStream("F:\\"
         + new Date().getMinutes() + "-.avi");
       FileChannel fc = fileout.getChannel();
       fileout.write(moMoMsg.msgBytes);
       fc.close();
       fileout.close();
      }
      
     }

    控制台打印:

    客户端:

     

    本次加密用时 : 774
    本次加密用时 : 651
    --发送多媒体信息 = {"getter":"002","sender":"001","type":"pic"} msgBytesLen = 16174624

     

    服务器:

    本次解密用时 : 177

    本次解密用时 : 597
    服务器 收到多媒体本信息 : {"getter":"002","sender":"001","type":"pic"}多媒体信息长度16174616

     

    从上可以看到:加密不管是对文本信息加密还是对多媒体文件加密,都比较耗时间,解密就相对较快。

     

    具体工程:http://download.csdn.net/detail/u011102153/8615791

     

     

          

    展开全文
  • 豪义网络的 ArdorTM Mobile Data Service Platform (MDSP),即移动数据服务平台,是电信级、稳定、具有高可伸缩性的增值业务平台,率先提供多媒体消息服务。系统既可以应用于现有的2G及2.5G网络系统,也可以平滑过渡...
  • 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息...

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息,这里以图片消息的回复为例进行讲解!

    还记得之前将消息分类的标准就是一种是不需要上传多媒体资源到腾讯服务器的而另外一种是需要的,所以在这里我们所需要做的第一步就是上传资源到腾讯服务器,这里我们调用【素材管理】接口(后面将会有专门的章节讲述)进行图片的上传,同样的这个接口可以提供我们对语音、视频、音乐等消息的管理,这里以图片为例(文档地址:http://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449290dfd43d006.html  )。在文档中我们可以发现这里上传的方式是模拟表单的方式上传,然后返回给我们我们需要在回复消息中需要用到的参数:media_id!

    (一)素材接口图片上传

    按照之前我们的约定将接口请求的url写入到配置文件interface_url.properties中:

    1
    2
    3
    4

    然后我在这里写了一个模拟表单上传的工具类HttpPostUploadUtil.java,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    package com.cuiyongzhi.wechat.util;
     
    import java.io.BufferedReader;  
    import java.io.DataInputStream;  
    import java.io.DataOutputStream;  
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.InputStreamReader;  
    import java.io.OutputStream;  
    import java.net.HttpURLConnection;  
    import java.net.URL;  
    import java.util.Iterator;  
    import java.util.Map;  
     
    import javax.activation.MimetypesFileTypeMap;
    import com.cuiyongzhi.web.util.GlobalConstants;
      
    /**
     * ClassName: HttpPostUploadUtil
     * @Description: 多媒体上传
     * @author dapengniao
     * @date 2016年3月14日 上午11:56:55
     */
    public class HttpPostUploadUtil {  
         
        public String urlStr; 
         
        public HttpPostUploadUtil(){
            urlStr = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token="+GlobalConstants.getInterfaceUrl("access_token")+"&type=image";  
        }
           
           
       
        /** 
         * 上传图片 
         *  
         * @param urlStr 
         * @param textMap 
         * @param fileMap 
         * @return 
         */  
        @SuppressWarnings("rawtypes")
        public String formUpload(Map<String, String> textMap,  
                Map<String, String> fileMap) {  
            String res = "";  
            HttpURLConnection conn = null;  
            String BOUNDARY = "---------------------------123821742118716"//boundary就是request头和上传文件内容的分隔符  
            try {  
                URL url = new URL(urlStr);  
                conn = (HttpURLConnection) url.openConnection();  
                conn.setConnectTimeout(5000);  
                conn.setReadTimeout(30000);  
                conn.setDoOutput(true);  
                conn.setDoInput(true);  
                conn.setUseCaches(false);  
                conn.setRequestMethod("POST");  
                conn.setRequestProperty("Connection""Keep-Alive");  
                conn  
                        .setRequestProperty("User-Agent",  
                                "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");  
                conn.setRequestProperty("Content-Type",  
                        "multipart/form-data; boundary=" + BOUNDARY);  
       
                OutputStream out = new DataOutputStream(conn.getOutputStream());  
                // text  
                if (textMap != null) {  
                    StringBuffer strBuf = new StringBuffer();  
                    Iterator<?> iter = textMap.entrySet().iterator();  
                    while (iter.hasNext()) {  
                        Map.Entry entry = (Map.Entry) iter.next();  
                        String inputName = (String) entry.getKey();  
                        String inputValue = (String) entry.getValue();  
                        if (inputValue == null) {  
                            continue;  
                        }  
                        strBuf.append("\r\n").append("--").append(BOUNDARY).append(  
                                "\r\n");  
                        strBuf.append("Content-Disposition: form-data; name=\""  
                                + inputName + "\"\r\n\r\n");  
                        strBuf.append(inputValue);  
                    }  
                    out.write(strBuf.toString().getBytes());  
                }  
       
                // file  
                if (fileMap != null) {  
                    Iterator<?> iter = fileMap.entrySet().iterator();  
                    while (iter.hasNext()) {  
                        Map.Entry entry = (Map.Entry) iter.next();  
                        String inputName = (String) entry.getKey();  
                        String inputValue = (String) entry.getValue();  
                        if (inputValue == null) {  
                            continue;  
                        }  
                        File file = new File(inputValue);  
                        String filename = file.getName();  
                        String contentType = new MimetypesFileTypeMap()  
                                .getContentType(file);  
                        if (filename.endsWith(".jpg")) {  
                            contentType = "image/jpg";  
                        }  
                        if (contentType == null || contentType.equals("")) {  
                            contentType = "application/octet-stream";  
                        }  
       
                        StringBuffer strBuf = new StringBuffer();  
                        strBuf.append("\r\n").append("--").append(BOUNDARY).append(  
                                "\r\n");  
                        strBuf.append("Content-Disposition: form-data; name=\""  
                                + inputName + "\"; filename=\"" + filename  
                                "\"\r\n");  
                        strBuf.append("Content-Type:" + contentType + "\r\n\r\n");  
       
                        out.write(strBuf.toString().getBytes());  
       
                        DataInputStream in = new DataInputStream(  
                                new FileInputStream(file));  
                        int bytes = 0;  
                        byte[] bufferOut = new byte[1024];  
                        while ((bytes = in.read(bufferOut)) != -1) {  
                            out.write(bufferOut, 0, bytes);  
                        }  
                        in.close();  
                    }  
                }  
       
                byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();  
                out.write(endData);  
                out.flush();  
                out.close();  
       
                // 读取返回数据  
                StringBuffer strBuf = new StringBuffer();  
                BufferedReader reader = new BufferedReader(new InputStreamReader(  
                        conn.getInputStream()));  
                String line = null;  
                while ((line = reader.readLine()) != null) {  
                    strBuf.append(line).append("\n");  
                }  
                res = strBuf.toString();  
                reader.close();  
                reader = null;  
            catch (Exception e) {  
                System.out.println("发送POST请求出错。" + urlStr);  
                e.printStackTrace();  
            finally {  
                if (conn != null) {  
                    conn.disconnect();  
                    conn = null;  
                }  
            }  
            return res;  
        }  
       
    }

    我们将工具类写好之后就需要在我们消息回复中加入对应的响应代码,这里为了测试我将响应代码加在【关注事件】中!

    (二)图片回复

    这里我们需要修改的是我们的【事件消息业务分发器】的代码,这里我们将我们的回复加在【关注事件】中,简单代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    String openid = map.get("FromUserName"); // 用户openid
    String mpid = map.get("ToUserName"); // 公众号原始ID
    ImageMessage imgmsg = new ImageMessage();
    imgmsg.setToUserName(openid);
    imgmsg.setFromUserName(mpid);
    imgmsg.setCreateTime(new Date().getTime());
    imgmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_Image);
    if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { // 关注事件
        System.out.println("==============这是关注事件!");
        Image img = new Image();
        HttpPostUploadUtil util=new HttpPostUploadUtil();
        String filepath="H:\\1.jpg";  
        Map<String, String> textMap = new HashMap<String, String>();  
        textMap.put("name""testname");  
        Map<String, String> fileMap = new HashMap<String, String>();  
        fileMap.put("userfile", filepath); 
        String mediaidrs = util.formUpload(textMap, fileMap);
        System.out.println(mediaidrs);
        String mediaid=JSONObject.fromObject(mediaidrs).getString("media_id");
        img.setMediaId(mediaid);
        imgmsg.setImage(img);
        return MessageUtil.imageMessageToXml(imgmsg);
    }

    到这里代码基本就已经完成整个的图片消息回复的内容,同样的不论是语音回复、视频回复等流程都是一样的,所以其他的就不在做过多的讲述了,最后的大致效果如下:

    1.png

    正常的消息回复的内容我们就讲述的差不多了,下一篇我们讲述基于消息回复的一些应用【关键字回复及超链接回复】的实现,感谢你的翻阅,如有疑问可以留言讨论!

    展开全文
  • 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息...

    转自:http://www.cuiyongzhi.com/post/46.html

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息,这里以图片消息的回复为例进行讲解!

    还记得之前将消息分类的标准就是一种是不需要上传多媒体资源到腾讯服务器的而另外一种是需要的,所以在这里我们所需要做的第一步就是上传资源到腾讯服务器,这里我们调用【素材管理】接口(后面将会有专门的章节讲述)进行图片的上传,同样的这个接口可以提供我们对语音、视频、音乐等消息的管理,这里以图片为例(文档地址:http://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449290dfd43d006.html  )。在文档中我们可以发现这里上传的方式是模拟表单的方式上传,然后返回给我们我们需要在回复消息中需要用到的参数:media_id!

    (一)素材接口图片上传

    按照之前我们的约定将接口请求的url写入到配置文件interface_url.properties中:

    1
    2
    3
    4
    #获取token的url
    #永久多媒体文件上传url

    然后我在这里写了一个模拟表单上传的工具类HttpPostUploadUtil.java,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    package com.cuiyongzhi.wechat.util;
     
    import java.io.BufferedReader;  
    import java.io.DataInputStream;  
    import java.io.DataOutputStream;  
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.InputStreamReader;  
    import java.io.OutputStream;  
    import java.net.HttpURLConnection;  
    import java.net.URL;  
    import java.util.Iterator;  
    import java.util.Map;  
     
    import javax.activation.MimetypesFileTypeMap;
    import com.cuiyongzhi.web.util.GlobalConstants;
      
    /**
     * ClassName: HttpPostUploadUtil
     * @Description: 多媒体上传
     * @author dapengniao
     * @date 2016年3月14日 上午11:56:55
     */
    public class HttpPostUploadUtil {  
         
        public String urlStr; 
         
        public HttpPostUploadUtil(){
            urlStr = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token="+GlobalConstants.getInterfaceUrl("access_token")+"&type=image";  
        }
           
           
       
        /** 
         * 上传图片 
         *  
         * @param urlStr 
         * @param textMap 
         * @param fileMap 
         * @return 
         */  
        @SuppressWarnings("rawtypes")
        public String formUpload(Map<String, String> textMap,  
                Map<String, String> fileMap) {  
            String res = "";  
            HttpURLConnection conn = null;  
            String BOUNDARY = "---------------------------123821742118716"//boundary就是request头和上传文件内容的分隔符  
            try {  
                URL url = new URL(urlStr);  
                conn = (HttpURLConnection) url.openConnection();  
                conn.setConnectTimeout(5000);  
                conn.setReadTimeout(30000);  
                conn.setDoOutput(true);  
                conn.setDoInput(true);  
                conn.setUseCaches(false);  
                conn.setRequestMethod("POST");  
                conn.setRequestProperty("Connection""Keep-Alive");  
                conn  
                        .setRequestProperty("User-Agent",  
                                "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");  
                conn.setRequestProperty("Content-Type",  
                        "multipart/form-data; boundary=" + BOUNDARY);  
       
                OutputStream out = new DataOutputStream(conn.getOutputStream());  
                // text  
                if (textMap != null) {  
                    StringBuffer strBuf = new StringBuffer();  
                    Iterator<?> iter = textMap.entrySet().iterator();  
                    while (iter.hasNext()) {  
                        Map.Entry entry = (Map.Entry) iter.next();  
                        String inputName = (String) entry.getKey();  
                        String inputValue = (String) entry.getValue();  
                        if (inputValue == null) {  
                            continue;  
                        }  
                        strBuf.append("\r\n").append("--").append(BOUNDARY).append(  
                                "\r\n");  
                        strBuf.append("Content-Disposition: form-data; name=\""  
                                + inputName + "\"\r\n\r\n");  
                        strBuf.append(inputValue);  
                    }  
                    out.write(strBuf.toString().getBytes());  
                }  
       
                // file  
                if (fileMap != null) {  
                    Iterator<?> iter = fileMap.entrySet().iterator();  
                    while (iter.hasNext()) {  
                        Map.Entry entry = (Map.Entry) iter.next();  
                        String inputName = (String) entry.getKey();  
                        String inputValue = (String) entry.getValue();  
                        if (inputValue == null) {  
                            continue;  
                        }  
                        File file = new File(inputValue);  
                        String filename = file.getName();  
                        String contentType = new MimetypesFileTypeMap()  
                                .getContentType(file);  
                        if (filename.endsWith(".jpg")) {  
                            contentType = "image/jpg";  
                        }  
                        if (contentType == null || contentType.equals("")) {  
                            contentType = "application/octet-stream";  
                        }  
       
                        StringBuffer strBuf = new StringBuffer();  
                        strBuf.append("\r\n").append("--").append(BOUNDARY).append(  
                                "\r\n");  
                        strBuf.append("Content-Disposition: form-data; name=\""  
                                + inputName + "\"; filename=\"" + filename  
                                "\"\r\n");  
                        strBuf.append("Content-Type:" + contentType + "\r\n\r\n");  
       
                        out.write(strBuf.toString().getBytes());  
       
                        DataInputStream in = new DataInputStream(  
                                new FileInputStream(file));  
                        int bytes = 0;  
                        byte[] bufferOut = new byte[1024];  
                        while ((bytes = in.read(bufferOut)) != -1) {  
                            out.write(bufferOut, 0, bytes);  
                        }  
                        in.close();  
                    }  
                }  
       
                byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();  
                out.write(endData);  
                out.flush();  
                out.close();  
       
                // 读取返回数据  
                StringBuffer strBuf = new StringBuffer();  
                BufferedReader reader = new BufferedReader(new InputStreamReader(  
                        conn.getInputStream()));  
                String line = null;  
                while ((line = reader.readLine()) != null) {  
                    strBuf.append(line).append("\n");  
                }  
                res = strBuf.toString();  
                reader.close();  
                reader = null;  
            catch (Exception e) {  
                System.out.println("发送POST请求出错。" + urlStr);  
                e.printStackTrace();  
            finally {  
                if (conn != null) {  
                    conn.disconnect();  
                    conn = null;  
                }  
            }  
            return res;  
        }  
       
    }

    我们将工具类写好之后就需要在我们消息回复中加入对应的响应代码,这里为了测试我将响应代码加在【关注事件】中!

    (二)图片回复

    这里我们需要修改的是我们的【事件消息业务分发器】的代码,这里我们将我们的回复加在【关注事件】中,简单代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    String openid = map.get("FromUserName"); // 用户openid
    String mpid = map.get("ToUserName"); // 公众号原始ID
    ImageMessage imgmsg = new ImageMessage();
    imgmsg.setToUserName(openid);
    imgmsg.setFromUserName(mpid);
    imgmsg.setCreateTime(new Date().getTime());
    imgmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_Image);
    if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { // 关注事件
        System.out.println("==============这是关注事件!");
        Image img = new Image();
        HttpPostUploadUtil util=new HttpPostUploadUtil();
        String filepath="H:\\1.jpg";  
        Map<String, String> textMap = new HashMap<String, String>();  
        textMap.put("name""testname");  
        Map<String, String> fileMap = new HashMap<String, String>();  
        fileMap.put("userfile", filepath); 
        String mediaidrs = util.formUpload(textMap, fileMap);
        System.out.println(mediaidrs);
        String mediaid=JSONObject.fromObject(mediaidrs).getString("media_id");
        img.setMediaId(mediaid);
        imgmsg.setImage(img);
        return MessageUtil.imageMessageToXml(imgmsg);
    }

    到这里代码基本就已经完成整个的图片消息回复的内容,同样的不论是语音回复、视频回复等流程都是一样的,所以其他的就不在做过多的讲述了,最后的大致效果如下:

    1.png

    正常的消息回复的内容我们就讲述的差不多了,下一篇我们讲述基于消息回复的一些应用【关键字回复及超链接回复】的实现,感谢你的翻阅,如有疑问可以留言讨论!

    转载于:https://www.cnblogs.com/sharpest/p/10236865.html

    展开全文
  • 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息...

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息,这里以图片消息的回复为例进行讲解!

    还记得之前将消息分类的标准就是一种是不需要上传多媒体资源到腾讯服务器的而另外一种是需要的,所以在这里我们所需要做的第一步就是上传资源到腾讯服务器,这里我们调用【素材管理】接口(后面将会有专门的章节讲述)进行图片的上传,同样的这个接口可以提供我们对语音、视频、音乐等消息的管理,这里以图片为例(文档地址:http://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449290dfd43d006.html  )。在文档中我们可以发现这里上传的方式是模拟表单的方式上传,然后返回给我们我们需要在回复消息中需要用到的参数:media_id!

    (一)素材接口图片上传

    按照之前我们的约定将接口请求的url写入到配置文件interface_url.properties中:

    1 #获取token的url
    2 tokenUrl=https://api.weixin.qq.com/cgi-bin/token
    3 #永久多媒体文件上传url
    4 mediaUrl=http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=

    然后我在这里写了一个模拟表单上传的工具类HttpPostUploadUtil.java,代码如下:

      1 package com.gede.wechat.util;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.DataInputStream;
      5 import java.io.DataOutputStream;
      6 import java.io.File;
      7 import java.io.FileInputStream;
      8 import java.io.InputStreamReader;
      9 import java.io.OutputStream;
     10 import java.net.HttpURLConnection;
     11 import java.net.URL;
     12 import java.util.Iterator;
     13 import java.util.Map;
     14 
     15 import javax.activation.MimetypesFileTypeMap;
     16 
     17 import com.gede.web.util.GlobalConstants;
     18 
     19 /**
     20  * @author gede
     21  * @version date:2019年5月26日 下午8:47:28
     22  * @description :
     23  */
     24 public class HttpPostUploadUtil {
     25 
     26     public String urlStr;
     27 
     28     public HttpPostUploadUtil() {
     29         urlStr = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token="
     30                 + GlobalConstants.getInterfaceUrl("access_token") + "&type=image";
     31     }
     32 
     33     /**
     34      * 上传图片
     35      * 
     36      * @param urlStr
     37      * @param textMap
     38      * @param fileMap
     39      * @return
     40      */
     41     @SuppressWarnings("rawtypes")
     42     public String formUpload(Map<String, String> textMap, Map<String, String> fileMap) {
     43         String res = "";
     44         HttpURLConnection conn = null;
     45         String BOUNDARY = "---------------------------123821742118716"; // boundary就是request头和上传文件内容的分隔符
     46         try {
     47             URL url = new URL(urlStr);
     48             conn = (HttpURLConnection) url.openConnection();
     49             conn.setConnectTimeout(5000);
     50             conn.setReadTimeout(30000);
     51             conn.setDoOutput(true);
     52             conn.setDoInput(true);
     53             conn.setUseCaches(false);
     54             conn.setRequestMethod("POST");
     55             conn.setRequestProperty("Connection", "Keep-Alive");
     56             conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
     57             conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
     58 
     59             OutputStream out = new DataOutputStream(conn.getOutputStream());
     60             // text
     61             if (textMap != null) {
     62                 StringBuffer strBuf = new StringBuffer();
     63                 Iterator<?> iter = textMap.entrySet().iterator();
     64                 while (iter.hasNext()) {
     65                     Map.Entry entry = (Map.Entry) iter.next();
     66                     String inputName = (String) entry.getKey();
     67                     String inputValue = (String) entry.getValue();
     68                     if (inputValue == null) {
     69                         continue;
     70                     }
     71                     strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
     72                     strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n");
     73                     strBuf.append(inputValue);
     74                 }
     75                 out.write(strBuf.toString().getBytes());
     76             }
     77 
     78             // file
     79             if (fileMap != null) {
     80                 Iterator<?> iter = fileMap.entrySet().iterator();
     81                 while (iter.hasNext()) {
     82                     Map.Entry entry = (Map.Entry) iter.next();
     83                     String inputName = (String) entry.getKey();
     84                     String inputValue = (String) entry.getValue();
     85                     if (inputValue == null) {
     86                         continue;
     87                     }
     88                     File file = new File(inputValue);
     89                     String filename = file.getName();
     90                     String contentType = new MimetypesFileTypeMap().getContentType(file);
     91                     if (filename.endsWith(".jpg")) {
     92                         contentType = "image/jpg";
     93                     }
     94                     if (contentType == null || contentType.equals("")) {
     95                         contentType = "application/octet-stream";
     96                     }
     97 
     98                     StringBuffer strBuf = new StringBuffer();
     99                     strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
    100                     strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + filename
    101                             + "\"\r\n");
    102                     strBuf.append("Content-Type:" + contentType + "\r\n\r\n");
    103 
    104                     out.write(strBuf.toString().getBytes());
    105 
    106                     DataInputStream in = new DataInputStream(new FileInputStream(file));
    107                     int bytes = 0;
    108                     byte[] bufferOut = new byte[1024];
    109                     while ((bytes = in.read(bufferOut)) != -1) {
    110                         out.write(bufferOut, 0, bytes);
    111                     }
    112                     in.close();
    113                 }
    114             }
    115 
    116             byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
    117             out.write(endData);
    118             out.flush();
    119             out.close();
    120 
    121             // 读取返回数据
    122             StringBuffer strBuf = new StringBuffer();
    123             BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    124             String line = null;
    125             while ((line = reader.readLine()) != null) {
    126                 strBuf.append(line).append("\n");
    127             }
    128             res = strBuf.toString();
    129             reader.close();
    130             reader = null;
    131         } catch (Exception e) {
    132             System.out.println("发送POST请求出错。" + urlStr);
    133             e.printStackTrace();
    134         } finally {
    135             if (conn != null) {
    136                 conn.disconnect();
    137                 conn = null;
    138             }
    139         }
    140         return res;
    141     }
    142 
    143 }

    我们将工具类写好之后就需要在我们消息回复中加入对应的响应代码,这里为了测试我将响应代码加在【关注事件】中!

    (二)图片回复

    这里我们需要修改的是我们的【事件消息业务分发器】的代码,这里我们将我们的回复加在【关注事件】中,简单代码如下:

     1 String openid = map.get("FromUserName"); // 用户openid
     2 String mpid = map.get("ToUserName"); // 公众号原始ID
     3 ImageMessage imgmsg = new ImageMessage();
     4 imgmsg.setToUserName(openid);
     5 imgmsg.setFromUserName(mpid);
     6 imgmsg.setCreateTime(new Date().getTime());
     7 imgmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_Image);
     8 if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { // 关注事件
     9     System.out.println("==============这是关注事件!");
    10     Image img = new Image();
    11     HttpPostUploadUtil util=new HttpPostUploadUtil();
    12     String filepath="H:\\1.jpg";  
    13     Map<String, String> textMap = new HashMap<String, String>();  
    14     textMap.put("name", "testname");  
    15     Map<String, String> fileMap = new HashMap<String, String>();  
    16     fileMap.put("userfile", filepath); 
    17     String mediaidrs = util.formUpload(textMap, fileMap);
    18     System.out.println(mediaidrs);
    19     String mediaid=JSONObject.fromObject(mediaidrs).getString("media_id");
    20     img.setMediaId(mediaid);
    21     imgmsg.setImage(img);
    22     return MessageUtil.imageMessageToXml(imgmsg);
    23 }

    到这里代码基本就已经完成整个的图片消息回复的内容,同样的不论是语音回复、视频回复等流程都是一样的,下一篇再练习一个关于语音回复的,最后的大致效果如下:

    转载于:https://www.cnblogs.com/gede/p/10927739.html

    展开全文
  • Hashtag.io是一个基于PHP的社交网站,支持专有的多媒体内容,共享以及私人或团体消息服务。 快速链接 屏幕截图 产品特点 登录,注册,忘记密码(带有电子邮件验证)。 快速登录,就像在Facebook和Instagram中一样...
  • VoIP的优势是能广泛地采用Internet和IP互连的环境,提供比传统业务更多、更好的服务。 VoIP可以在IP网络上便宜的传送语音、传真、视频、和数据等业务,如统一消息、虚拟电话、虚拟语音/传真邮箱、查号业务、...
  • VoIP最大的优势是能广泛地采用Internet和全球IP互连的环境,提供比传统业务更多、更好的服务。 VoIP可以在IP网络上便宜的传送语音、传真、视频、和数据等业务,如统一消息、虚拟电话、虚拟语音/传真邮箱、查号业务...
  • 它能把视频、音频、网页、GIF图、文字等多种表现形式通过多媒体短信形式触达用户。本文将带你了解阿里云通信数字短信产品的开通与使用。 一、数字短信功能如何开通? 1.开通数字短信首先需要先在阿里云官网开通...
  • [文档标题] APP消息推送 PAGE 4 APP消息推送 一推送方式基础 当APP需要和服务器交互时基本上都需要获取服务器端的数据要获取服务器上不定时更新的数据一般来说有两种方法第一种是客户端使用PULL拉的方式就是隔一段...
  • ...公众号可调用本接口来上传图片、语音、视频等文件到微信服务器,上传后服务器会返回对应的media_id,公众号此后可根据该media_id来获取多媒体。请注意,media_id是可复用的,调用该接口需http
  • 基于IMS的即时消息服务器的设计与实现,杨润心,,随着电信市场竞争日益激烈,移动、固定网络不断融合,为了提供更加多样化的多媒体业务,第三代移动通信伙伴计划(3GPP)提出了IP多媒�
  • 前言大家好呀~ 我是想出去玩的哪吒。最近关于疫情的好消息越来越多,生活开始回归正轨,大家也逐步进入工作状态了。话不多说,进行学习了。下面我们就来看一看,邀请掘友们的点赞留言。多媒体多媒体...
  • 多媒体教室

    2013-06-14 08:10:31
    多媒体电子教室 说明书 2007.2 目 录 第一章 产品介绍 2 第二章 安装与注册 2  2.1 系统需求 2  2.2 设置网络协议 2  2.3产品安装 2  2.4 跨网段路由器的安装 2  2.5 试用与注册 错误!...
  • 企业在使用接口时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。通过本接口,企业可以上传或下载多媒体文件。 注意,每个多媒体文件(media_id)会在上传到微信服务器3天后自动删除,...
  • 公众号在使用接口时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。通过本接口,公众号可以上传或下载多媒体文件。但请注意,每个多媒体文件(media_id)会在上传、用户发送到微信服务器3...
  • MMS协议

    千次阅读 2013-09-20 15:29:23
    MMS是Multimedia Messaging Service (多媒体消息服务)的缩写,即所说的彩信,可以用于传送文字,图片,动画,音视频等多媒体信息。 手机终端合成多媒体消息后,可以向网内的合法用户发送,由MMSC(多媒体消息中心...
  • 7.6 多媒体文件系统泛型多媒体系统和传统的文件系统有很大的不同,采用的是类似VCR工作方式一样的拉取型服务器(pull server): 用户进程发出start系统调用,指定要读取的文件和其他各种参数,然后用户进程以帧...
  • 多媒体之音效

    2015-05-05 11:25:00
    QQ聊天有消息时会有提示音,现在用AudioToolbox实现提示音的效果。 注意:xcode有些版本不能用AudioToolbox播放声音可能是一些bug吧,我测试好久,在他Mac上可以,在我Mac上就不可以,最终还是oliver帮忙搞定 Audio...
  • 多媒体文件I/O

    2011-11-15 00:21:14
    所有的多媒体文件I/O函数名前缀为mmio,消息名前缀为MMIO。低级波形音频函数:低级音频服务允许用户直接与音频设备驱动程序打交道,直接控制音频设备如波形,Midi的播放与记录,低级音频函数是一个设备无关接口。...
  • 彩信制作之SMIL规范

    2011-12-19 11:41:09
    彩信制作之SMIL规范   关键词:MMS、MM、SMIL ...MMS Multimedia Messaging Service 多媒体消息服务 MMSC Multimedia Messaging Service Center 多媒体消息服务中心 SMIL Synchronized Multimedia Integ

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 449
精华内容 179
关键字:

多媒体消息服务