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

简介:
/* 
     * 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/

目录
相关文章
|
7月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
6月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
52 1
|
6月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
109 0
|
5月前
|
Java
如何在Java中实现多线程的Socket服务器?
在Java中,多线程Socket服务器能同时处理多个客户端连接以提升并发性能。示例代码展示了如何创建此类服务器:监听指定端口,并为每个新连接启动一个`ClientHandler`线程进行通信处理。使用线程池管理这些线程,提高了效率。`ClientHandler`读取客户端消息并响应,支持简单的文本交互,如发送欢迎信息及处理退出命令。
|
6月前
|
程序员 API 开发者
Socket与HTTP协议的实践
【6月更文挑战第4天】本文介绍了Python中的网络编程,包括Socket编程和基于HTTP协议的实践。Socket编程是网络通信的基础,Python的`socket`模块简化了其使用。文中展示了服务器和客户端的简单示例,以及如何通过多线程处理多个客户端连接。另外,文章讨论了HTTP协议,推荐了`requests`库,并给出了发送GET和POST请求的例子。最后,总结了Socket编程和HTTP协议在网络编程中的应用及其在Web开发和API交互中的重要性。
70 5
|
6月前
|
网络协议 应用服务中间件 网络性能优化
解析TCP /UDP协议的 socket 调用的过程
【6月更文挑战第2天】该文介绍了传输层的两种主要协议TCP和UDP的区别。TCP是面向连接、可靠的,提供顺序无错的数据传输,而UDP则是无连接、不可靠的,不保证数据顺序或不丢失。
|
7月前
|
监控 网络协议 iOS开发
程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案
程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案
241 0
|
7月前
|
网络协议 Java 网络安全
【计算机网络】—— Socket通信编程与传输协议分析
【计算机网络】—— Socket通信编程与传输协议分析
|
7月前
|
Linux API C++
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
127 2
|
7月前
|
Linux 调度
基于Linux socket聊天室-多线程服务器问题处理(02)
基于Linux socket聊天室-多线程服务器问题处理(02)
38 0

热门文章

最新文章