javavuser socket

基于Loadrunner平台Socket协议的JavaVuser(多线程)

 

/*
 * LoadRunner Java script. (Build: 15)
 * Script Description: 
 *
 * 作者:谷博涛
 * 制作时间:2012-1-18
 * E-mail:captain_gbt@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

 

posted @ 2016-02-17 16:49  milkty  阅读(250)  评论(0)    收藏  举报