hi on forum, on ocassion need community because don't understand how keep open socket send , receive data device. instance when send first command receive answer, receive answer, after first send/receive when i'm trying send second command have no response , in ocassions throws error.
this class used in mule 3.5 ce java 1.7
public class tcpmuleoutbasic extends tcpmessagereceiver { public tcpmuleoutbasic(connector connector, flowconstruct flowconstruct, inboundendpoint endpoint) throws createexception { super(connector, flowconstruct, endpoint); } protected work creatework(socket socket) throws ioexception { return new mytcpworker(socket, this); } protected class mytcpworker extends tcpmessagereceiver.tcpworker { public mytcpworker(socket socket, abstractmessagereceiver receiver) throws ioexception { super(socket, receiver); // todo auto-generated constructor stub } @override protected object getnextmessage(object resource) throws exception { arraylist<string> testarr2 = new arraylist<>(); bufferedreader entrada; //socket clientsocket = null; try{ arraylist<string> testarr = new arraylist<>(); //this.socket. //clientsocket = this.socket; //open in buffer, de entrada entrada = new bufferedreader(new inputstreamreader(this.socket.getinputstream())); //open out buffer de salida envia comando printstream pingstream = new printstream(this.socket.getoutputstream()); //printstream pingstream = new dataoutputstream(clientsocket.getoutputstream()); system.out.println("status socket val 1.2: "+this.socket.isclosed()+" con "+isconnected()); testarr = this.enviarcomando("#ser",1,this.socket,entrada,pingstream); system.out.println("array valor 1: " + testarr.get(0)); //open second time, problem dont work //abro buffer de entrada entrada = new bufferedreader(new inputstreamreader(this.socket.getinputstream())); //abro buffer de salida envia comando pingstream = new printstream(this.socket.getoutputstream()); system.out.println("status socket val 2: "+this.socket.isclosed()+" con "+isconnected()); testarr2 = this.enviarcomando("#nlo",2,this.socket,entrada,pingstream); /*system.out.println("arreglo valor 2: " + testarr2.get(0));*/ datain.close(); return testarr; }catch(ioexception e) { system.out.println("error arreglo:"+e.getmessage()); return null; } }//fin nextmessange //metodo para hacer peticion //function send recive data protected arraylist<string> enviarcomando (string comando,int req,socket opensocket,bufferedreader entrada,printstream pingstream) throws exception { boolean initconnection = false; string lineacomando; string mensajeservidor; socket clientsocket = null; arraylist<string> retorno = new arraylist<string>(); try{ if (initconnection == false) { lineacomando = comando; system.out.println("mandando comandos:"+lineacomando); clientsocket = opensocket; string direccion = clientsocket.getinetaddress().gethostaddress(); system.out.println("direccion:"+direccion); system.out.println("cliente en lĂnea ="+req); system.out.println("comando enviado:" + lineacomando); lineacomando = lineacomando + crc.getcrc16ccitt(lineacomando) + "\r"; pingstream.print(lineacomando); //entrada = new bufferedreader(new inputstreamreader(clientsocket.getinputstream())); //entrada.ready(); system.out.println("status flujo de entrada ="+req+entrada.ready()); int contador = 0; system.out.println("entrada: "+entrada.tostring()); while((mensajeservidor = entrada.readline()) != null) //mientras haya mensajes desde el cliente { contador++; //se muestra por pantalla el mensaje recibido retorno.add(mensajeservidor); system.out.println("mensaje dispositivo "+contador+ ": "+ mensajeservidor); } /* lineacomando = "#nlo"; system.out.println("mandando 2do comandos:"+lineacomando); lineacomando = lineacomando + crc.getcrc16ccitt(lineacomando) + "\r"; pingstream.print(lineacomando); while((mensajeservidor = entrada.readline()) != null) //mientras haya mensajes desde el cliente { contador++; //se muestra por pantalla el mensaje recibido retorno.add(mensajeservidor); system.out.println("mensaje dispositivo segundo"+contador+ ": "+ mensajeservidor); }*/ initconnection = true; } //datain.close(); initconnection = false; logger.debug("socket timeout"); system.out.println("cierro socket"); return retorno; }catch (socketexception e ) { system.out.println("error f:"+e.getmessage()+" "+comando+" request: "+req); return null; } } } }
the connector , flow.
<tcp:connector name="tcp" doc:name="tcp connector" clientsotimeout="100000" receivebacklog="0" receivebuffersize="0" sendbuffersize="0" serversotimeout="100000" socketsolinger="0" validateconnections="true" keepsendsocketopen="true" keepalive="true"> <receiver-threading-profile maxthreadsactive="5" maxthreadsidle="5" /> <reconnect-forever /> <!-- <service-overrides messagereceiver="tcpmuleout" />--> <service-overrides messagereceiver="ve.com.comware.socket.tcpmuleoutbasic" /> <tcp:direct-protocol payloadonly="true" /> </tcp:connector> <flow name="socketcomware0.1flow1" doc:name="socketcomware0.1flow1"> <tcp:inbound-endpoint host="107.170.3.231" port="2020" doc:name="tcp" responsetimeout="100000" exchange-pattern="request-response"/> <logger message="hola1" level="info" doc:name="logger"/> <logger message="test ----------------- #[message.payload[0]] -------------------#[message.payload[1]] " level="info" doc:name="logger"/> </flow>
the error:
org.mule.exception.defaultsystemexceptionstrategy: caught exception in exception strategy: index: 0, size: 0 java.lang.indexoutofboundsexception: index: 0, size: 0 @ java.util.arraylist.rangecheck(arraylist.java:635) @ java.util.arraylist.get(arraylist.java:411) @ ve.com.comware.socket.tcpmuleoutbasic$mytcpworker.getnextmessage(tcpmuleoutbasic.java:65)
please try , let me know can understand usecase -
<tcp:connector name="tcp1" validateconnections="true" sendbuffersize="0" receivebuffersize="0" receivebacklog="0" clientsotimeout="10000" serversotimeout="10000" socketsolinger="0" doc:name="tcp"> <tcp:direct-protocol payloadonly="false"/> </tcp:connector> <flow name="tcp-testflow"> <tcp:inbound-endpoint exchange-pattern="request-response" host="${host}" port="${port}" responsetimeout="10000" connector-ref="tcp1" doc:name="tcp"/> <logger message="this client sending - #[payload]" level="info" doc:name="logger"/> <set-payload value="hello server - #[payload]" doc:name="set payload"/> </flow>
Comments
Post a Comment