RABBITMQ/JAVA 客户端测试(再补:利用文件流)

Posted on 2016-12-05 15:32  itnnn  阅读(2809)  评论(0编辑  收藏  举报

(一)这里可以先复习一下java输入输出流和文件操作---

1.File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名。判断指定文件是否存在、获取当前目录中的文件列表,创建、删除文件和目录等。

2.I/O流 根据处理数据类型的不同分为:字符流和字节流

根据数据流向不同分为:输入流和输出流

(二)在JAVA里面,可以用复制语句”A=B”给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变.
以下是归纳的JAVA中复制数组的方法:
1.使用FOR循环,将数组的每个元素复制或者复制指定元素,不过效率差一点
2.使用clone方法,得到数组的值,而不是引用,不能复制指定元素,灵活性差一点
3.使用System.arraycopy(src, srcPos, dest, destPos, length)方法,推荐使用
举例:
1.使用FOR循环
int[] src={1,3,5,6,7,8};
int[] dest = new int[6];
for(int i=0;i<6;i++) dest[i] = src[i];
2.使用clone
int[] src={1,3,5,6,7,8};
int[] dest;
dest=(int[]) src.clone();//使用clone创建
副本,注意clone要使用强制转换
3.使用System.arraycopy
int[] src={1,3,5,6,7,8};
int[] dest = new int[6];
System.arraycopy(src, 0, dest, 0, 6);
——————————————————————-
System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制.
其函数原型是:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

src:源数组; srcPos:源数组要复制的起始位置;
dest:目的数组; destPos:目的数组放置的起始位置;
length:复制的长度.

注意:src and dest都必须是同类型或者可以进行转换类型的数组.
有趣的是这个函数可以实现自己到自己复制,
比如:int[] fun ={0,1,2,3,4,5,6};
System.arraycopy(fun,0,fun,3,3);

则结果为:{0,1,2,0,1,2,6};

(三)下面利用文件流将功能扩充一下

原来的代码只能发送字符串的文字信息。如果要传送文件呢?txt文件?zip文件之类的等等..

可能代码扩充的不是太好,甚至当网络不好的时候还会出现一些问题,但是先将补充好的代码贴一下,后面如果有完善和修正的话再修改。

 

package bigbang;



import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.ShutdownSignalException;

import com.rabbitmq.client.Connection;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.Arrays; 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;

import com.rabbitmq.client.Channel;
class RecvThread extends Thread{
    RecvThread(String name){
        super(name);//调用父类带参数的构造方法
    }
    public void run(){
         final String QUEUE_NAME = "hello";
                 ConnectionFactory factory = new ConnectionFactory();  
                    factory.setHost("115.159.181.204");  
                    factory.setPort(5672);
                    factory.setUsername("admin");
                    factory.setPassword("admin");
                    // 打开连接和创建频道,与发送端一样  
                    Connection connection = null;
                    try {
                        connection = factory.newConnection();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }  
                    Channel channel = null;
                    try {
                        channel = connection.createChannel();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }  
              
                    // 声明队列,主要为了防止消息接收者先运行此程序,队列还不存在时创建队列。  
                    try {
                        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }  
                    // 创建队列消费者  

                    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
                    // 指定消费队列  
                    // 指定消费队列 
                    QueueingConsumer consumer = new QueueingConsumer(channel);  
                    try {
                        channel.basicConsume(QUEUE_NAME, true, consumer);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }  
                    while(true){  
                        QueueingConsumer.Delivery delivery = null;
                        try {
                            delivery = consumer.nextDelivery();
                        } catch (ShutdownSignalException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (ConsumerCancelledException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }  
                        byte[] message =delivery.getBody();
                        //String message = new (delivery.getBody());  
                        
                        try {
                            OutputStream os=new FileOutputStream("C:/Users/cdmin/Desktop/121.zip",true);
                            //byte[] buffer=delivery.getBody().length;
                            try {
                                os.write(message);
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            try {
                                os.close();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            
                        } catch (FileNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        System.out.println("file has been received! please scan your desktop!");
                        
                        //System.out.println(" [x] Received '" + message + "'");  
                    }  

            }

    }





public class zipzip {
     private final static String QUEUE_NAME = "hello";
    private static Object message;
      public static void main(String[] args) throws java.io.IOException {  
            /** 
             * 创建连接连接到MabbitMQ 
             */  
            // 设置MabbitMQ所在主机ip或者主机名
    

            ConnectionFactory factory = new ConnectionFactory();  
            factory.setHost("115.159.181.204");  
            factory.setPort(5672);
            System.out.println("input your username:");
            Scanner un=new Scanner(System.in);
            String username=null;
            username=un.next(); 
            System.out.println("input your password::");
            Scanner up=new Scanner(System.in);
            String userpassword=null;
            userpassword=up.nextLine(); 
            factory.setUsername(username);
            factory.setPassword(userpassword);
            // 创建一个连接  
            Connection connection = factory.newConnection();  
            // 创建一个频道  
            Channel channel = connection.createChannel();  
            // 指定一个队列  
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);  
            // 发送的消息 
            //String message=null;
            //String str=null;
               InputStream is =new FileInputStream("C:/Users/cdmin/Desktop/12.zip");
               byte[] buffer=new byte[8192];
               byte[] message=new byte[8192];
               int length=0;
            while(-1!=(length=is.read(buffer, 0, 8192))){
               
               
               //System.out.println(length); 
            System.arraycopy(buffer,0,message,0, length);
              //channel.basicPublish("", QUEUE_NAME, null,  message);  
               //for(int i=0;i<length;i++) message[i] = buffer[i];
               //
                    // str=new String(buffer,0,length);    
                 }
                is.close();
                //System.out.println(buffer); 
          
                
                //byte[] message = str.substring(0, str.length()-1).getBytes();
                
                //System.out.println(message);  
            //message=str;
        
            //Scanner s=new Scanner(System.in);
            
           //message=s.nextLine(); 
            // 往队列中发出一条消息  
            channel.basicPublish("", QUEUE_NAME, null,  message);  
            System.out.println(" [x] Sent '" +  "12.zip");  
            // 关闭频道和连接  
            channel.close();  
            connection.close();  
            RecvThread rthread= new RecvThread("test1");
            rthread.start();
        }  

}

运行结果如下:

比如传送一个zip压缩包------

控制台运行结果:    

看一下桌面:

我要发送的是12.zip 桌面应该接收到一个12.zip的压缩包 (这里为了区分我把接收到的压缩包命名为121.zip)