https://stackoverflow.com/questions/8403462/jmeter-execute-command-over-telnet-using-beanshell https://stackoverflow.com/questions/37702682/jmeter-tcp-sampler-doesnt-close-the-socket-after-data-is-sent/37718290#37718290 false true true port 2222 = localhost true ${port} false 5000 true 3000 10 stoptest false 1 1 1 false groovy 46e3b654-c6ad-4aa5-8188-e7e368c5ac81 import java.util.Date; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; class TimeServerHandler extends IoHandlerAdapter { private static final String EOL = "\n"; Logger log = LoggerFactory.getLogger(TimeServerHandler.class); public void exceptionCaught( IoSession session, Throwable cause ) throws Exception { log.error("Exception occured", cause); session.closeNow(); } public void messageReceived( IoSession session, Object message ) throws Exception { String str = message.trim().toString(); log.info("Received {}", str); String[] words = str.split(" "); if(words[0].equalsIgnoreCase("quit") ) { session.close(); } else if(words[0].equalsIgnoreCase("sleep")) { log.info("Sleeping for {}ms", words[1].toLong()); Thread.sleep(words[1].toLong()); Date date = new Date(); session.write( date.format("dd/MM/yyyy HH:mm:ss")+EOL ); } else { Date date = new Date(); session.write( date.format("dd/MM/yyyy HH:mm:ss")+EOL ); } log.info("Message written..."); } public void sessionIdle( IoSession session, IdleStatus status ) throws Exception { log.info("IDLE {}", session.getIdleCount(status)); } } IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast( "logger", new LoggingFilter() ); acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); acceptor.setHandler( new TimeServerHandler() ); acceptor.setReuseAddress(true); acceptor.getSessionConfig().setReadBufferSize( 2048 ); acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 ); props.put("TCP_SERVER", acceptor); def thread = Thread.start { acceptor.bind( new InetSocketAddress(Integer.parseInt(vars.get("port")))); }; SampleResult.setResponseMessageOK(); SampleResult.setResponseData("Starting TCP Server", "UTF-8"); 1 0 0 1000 100 continue false 1 1 1 false 1 0 0 groovy 699ef483-ad6f-4eac-a6f7-0371cbc65e63 vars.put("LF",URLDecoder.decode("%0D", "ASCII")); vars.put("CR",URLDecoder.decode("%0A", "ASCII")); Set Cariage return and Line feed as variables org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl true false hello${CR}${LF} false ${__time(dd/MM/yyyy HH:mm,)} Assertion.response_data false 16 Test timeout org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl true false 1000 1000 sleep 2000${CR}${LF} false 500 Assertion.response_code true 8 org.apache.jmeter.protocol.tcp.sampler.ReadException Assertion.response_message true 16 org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl true false quit${CR}${LF} false continue false 1 1 1 false org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl false false 68656C6C6F0A0D false e7ac0019-16aa-40b4-b30f-e254c0a75f27 import org.apache.commons.codec.binary.Hex; Hex hex = new Hex(); OUT.println(new String(hex.decode(prev.getResponseData()))); vars.put("result_decoded", new String(hex.decode(prev.getResponseData()))); groovy ${__time(dd/MM/yyyy HH:mm,)} Assertion.response_data false 16 variable result_decoded org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl false false 1000 1000 736C65657020323030300A0D false 500 Assertion.response_code true 8 org.apache.jmeter.protocol.tcp.sampler.ReadException Assertion.response_message true 16 org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl false false 717569740A0D false continue false 1 1 1 false org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl localhost true 2223 false 68656C6C6F0A0D true 500 Assertion.response_code true 16 result_decoded java.net.ConnectException: Connection refused Assertion.response_message true 16 result_decoded We strip part of Response Message after '(' as it's different between JVMs and breaks results comparison groovy d65ff29e-5d0c-47df-b464-e7a84fa88e66 String oldResponseMessage = prev.getResponseMessage(); int indexOfParenthesis = oldResponseMessage.indexOf("("); if(indexOfParenthesis>=0) { prev.setResponseMessage(oldResponseMessage.substring(0, indexOfParenthesis).trim()); } else { indexOfParenthesis = oldResponseMessage.lastIndexOf(":"); prev.setResponseMessage(oldResponseMessage.substring(0, indexOfParenthesis).trim()); } org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl localhostXXXX true 2223 false 68656C6C6F0A0D false 500 Assertion.response_code true 16 result_decoded java.net.UnknownHostException: localhostXXXX Assertion.response_message true 16 result_decoded org.foo.xxx localhost true 2222 false 68656C6C6F0A0D false 500 Assertion.response_code true 16 result_decoded Protocol handler not found Assertion.response_message true 16 result_decoded continue false 1 1 1 false org.apache.jmeter.protocol.tcp.sampler.LengthPrefixedBinaryTCPClientImpl true false 68656C6C6F0A0D true e7ac0019-16aa-40b4-b30f-e254c0a75f27 import org.apache.commons.codec.binary.Hex; Hex hex = new Hex(); OUT.println(new String(hex.decode(prev.getResponseData()))); vars.put("result_decoded", new String(hex.decode(prev.getResponseData()))); groovy ${__time(dd/MM/yyyy HH:mm,)} Assertion.response_data false 16 variable result_decoded org.apache.jmeter.protocol.tcp.sampler.LengthPrefixedBinaryTCPClientImpl true false 717569740A0D true continue false 1 1 1 false groovy 81a419ad-5207-446a-b0a0-2bfe2cd776ed import org.apache.jmeter.util.JMeterUtils; import org.apache.mina.core.session.IoSession; import org.apache.mina.core.service.IoAcceptor; IoAcceptor acceptor = props.get("TCP_SERVER"); acceptor.setCloseOnDeactivation(true); for (IoSession ss : acceptor.getManagedSessions().values()) { ss.close(true); } acceptor.unbind(); acceptor.dispose(); false saveConfig false false true true true true true false false false false false false true false false false false 0 true true TCP_TESTS.csv false saveConfig false false true true true true true false true true false false true false false false false false 0 true true TCP_TESTS.xml true