基於Loadrunner平臺Socket協議的JavaVuser(多執行緒)

玄學醬發表於2017-07-10
/* 

     * LoadRunner Java script. (Build: 15) 

     * Script Description:  

     * 

     * 作者:谷博濤 

     * 製作時間:2012-1-18 

     * E-mail:gubotao@foxmail.com 

     * Loadrunner:11.00 

     *  

     * 內容概要: 

     * 模擬基於Socket協議的即時訊息系統中的客戶端行為LR指令碼, 

     * 為模擬真實IM客戶端,接收訊息和傳送訊息分兩個執行緒工作。 

     *  

     */  

      

    import lrapi.lr;  

    import java.io.IOException;  

    import java.io.InputStream;  

    import java.io.OutputStream;  

    import java.net.Socket;  

    import java.net.UnknownHostException;  

    import java.util.Iterator;  

    import java.util.concurrent.atomic.AtomicBoolean;  

      

    public class Actions  

    {  

        // 客戶端  

        private Socket client;  

        // 房間號  

        private String roomId;  

        // 使用者ID  

        private String id;  

        // 輸出流  

        private OutputStream out;  

        // 輸入流  

        private InputStream in;  

        // 連線標誌  

        //private boolean connFlag = false;  

        private  AtomicBoolean connFlag =new AtomicBoolean(false);  

      

        // 客戶端是否結束標誌  

        //private boolean endFlag = true;  

        private  AtomicBoolean endFlag =new AtomicBoolean(true);  

      

      

        public int init() throws Throwable {  

            connect();   

        //lr.think_time(10);  

            return 0;  

        }//end of init  

      

      

        public int action() throws Throwable {  

            sendAction();  

            return 0;  

        }//end of action  

      

      

        public int end() throws Throwable {  

            sendEnd();  

            return 0;  

        }//end of end  

      

    //====主題程式碼==================//  

      

        //連線伺服器  

        private void connect() {  

            try {  

                    client = new Socket(“127.0.0.1”, 5222);  

                    System.out.println(“connect success!!!”);  

                    out = client.getOutputStream();  

                    in = client.getInputStream();  

                    receiveAction();  

                    login();  

            } catch (UnknownHostException e) {  

                    System.out.println(“UnknownHostException=” + e);  

                    e.printStackTrace();  

            } catch (IOException e) {  

                    System.out.println(“IOException=” + e);  

                    e.printStackTrace();  

            }  

        }  

      

        //登入伺服器  

        private void login() {  

            String loginMsg = “<msg type=”login” channel=”CCTV1″></msg>”;  

            sendMsg(loginMsg);  

        }  

      

        //啟動接收執行緒  

        private void receiveAction() {  

        new ReceiveThread().start();  

        }  

      

        //得到房間號碼和使用者ID  

        private void getEleVal(String msg) {  

        int index =0;  

      

        index = msg.indexOf(“to”);  

        msg = msg.substring(index + 4, msg.length());  

        index = msg.indexOf(“`”);  

        id = msg.substring(0, index);  

        System.out.println(roomId);  

      

        index = msg.indexOf(“roomId”);  

        msg = msg.substring(index + 8, msg.length());  

        index = msg.indexOf(“`”);  

        roomId = msg.substring(0, index);  

        System.out.println(id);  

      

        connFlag.set(true);  

        }  

      

        //傳送訊息  

        private void sendAction() {  

        if(connFlag.get()){  

            System.out.println(“傳送訊息—–>”);  

            String msg = “<msg type=”groupchat” channel=”CCTV1″ from=”” + id  

            + “” to=”” + roomId + “”><body>test</body></msg>”;  

          

            sendMsg(msg);  

        }  

        }  

      

        //呼叫寫入流方法  

        private void sendMsg(String msg) {  

        //new SendThread(msg).start();  

        writeMsg(msg);  

        }  

      

        //將訊息寫入流  

        private void writeMsg(String msg) {  

        try {  

            if (out != null) {  

            out.write(msg.getBytes(“UTF-8”));  

            out.flush();  

            }  

        } catch (Exception e) {  

            System.out.println(“Exception=” + e);  

        }  

        }  

      

        //關閉客戶端  

        private void sendEnd() {  

        endFlag.set(false);  

        try {  

            client.close();  

        } catch (IOException e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

        }  

        /** 

         * 接收訊息執行緒類 

         *  

         * @author Administrator 

         *  

         */  

        private class ReceiveThread extends Thread {  

        @Override  

        public void run() {  

            while (endFlag.get()) {// 迴圈接收訊息  

                try {  

                int len = in.available();  

      

                if(len>0){  

                    System.out.println(len);  

                    byte[] bytes = new byte[len];  

                    in.read(bytes);  

                    String result = new String(bytes);  

                    System.out.println(“接收到的訊息:” + result);  

      

                    if(result != null && !””.equals(result)&& result.contains(“res_bind”)){  

                    getEleVal(result);  

                    }  

                }  

                } catch (Exception e) {  

                // TODO: handle exception  

                }  

            }  

        }  

        }  

      

      

    //======傳送訊息執行緒類(本程式碼未用到)=========  

        private class SendThread extends Thread {  

        private String msg;  

          

        public SendThread(String msg) {  

            this.msg = msg;  

        }  

          

        @Override  

        public void run() {  

            if (connFlag.get()) {  

            writeMsg(msg);  

            }  

        }  

        }  

      

    }//end for class Actions  








====================================分割線================================



最新內容請見作者的GitHub頁:http://qaseven.github.io/


相關文章