0
After sending the event I have to close the program to send another event through the socket. I realized that it is not closing, gets stuck in the while
paps go through the publichProgress(response);
Actually when you walk into buffData = is.read( buff, 0, 2048 );
he pauses the thread.
SOCKET
protected Boolean doInBackground(String... params) {
boolean result = false;
try {
sockaddr = new InetSocketAddress( host, port );
socket = new Socket(); Log.i( "Status : ", "Openning socket");
socket.connect( sockaddr, timeout );
publishProgress( "Start Connection... " ); Log.i( "Start Connection... ", "" );
socket.setOOBInline( true ); Log.i( "Tcp receiver ", "" );
if (socket.isConnected()) {
publishProgress( "CONNECTED" ); Log.i( "Status : ", "Connected to Server " + host + ":" + port );
is = socket.getInputStream(); Log.i( "Get data : ", "Receiving response from Server..." );
os = socket.getOutputStream(); Log.i( "Send data : ", "Send data to Server..." );
for (String p : params) {
os.write( p.getBytes() );
}
os.flush();
byte[] buff = new byte[2048];
int buffData = is.read( buff, 0, 2048 );
while (buffData != -1) {
String response = new String( buff );
// Envia os dados para Main
publishProgress( response ); Log.i( "Get data : ", "Buffer from response..." );
buffData = is.read( buff, 0, 2048 );
}
}else{
publishProgress("CONNECT ERROR - Disconected ");
}
} catch(ConnectException e1){
publishProgress( "ERROR CONNECTION" ); Log.e( "SocketAndroid :", "Network is unreachable - End for timeout.", e1 );
result = true;
} catch (IOException e2) {
publishProgress( "ERROR CONNECTION" ); Log.e( "SocketAndroid :", "input and output error", e2 );
result = true;
} catch (Exception e3) {
publishProgress( "ERROR CONNECTION" ); Log.e( "SocketAndroid", "Generic error", e3 );
result = true;
} finally {
try {
if (is != null) {
is.close(); Log.i( "ImputStream : ", "close" );
}
if (os != null) {
os.close(); Log.i( "OutputStream : ", "close" );
}
if (socket != null) {
socket.close(); Log.i( "Socket : ", "close" );
publishProgress( "DISCONNECTED" ); Log.i( "Socket : ", "DISCONNECTED" );
}
} catch (Exception e) { Log.e( "SocketAndroid", "Error closing connection - ", e );
result = true;
}
}
return result;
}
Mainactivity
private void startSocket() {
if (servidor1.isEmpty() && servidor2.isEmpty()) {
Snackbar.make( btnPanico, "Verifique as configurações do seu app.", Snackbar.LENGTH_LONG ).setAction( "Action", null ).show();
return;
}
if (count <= (atemptcount / 2) && !servidor1.isEmpty()) {
server = servidor1;
} else if (count >= (atemptcount / 2) && !servidor2.isEmpty()) {
server = servidor2;
}
// try {
String txtenviando = getResources().getString( R.string.enviando );
txtSucess.setText( txtenviando );
// Recupera host e porta
String hostPort = String.valueOf( server ).trim();
int idxHost = hostPort.indexOf( ":" );
final String host = hostPort.substring( 0, idxHost );
final int port = Integer.parseInt( (hostPort.substring( idxHost + 1 )) );
// Instancia a classe de conexão com socket
st = new SocketTask( host, port, 5000 ) {
@SuppressLint("SetTextI18n")
@Override
protected void onProgressUpdate(final String... progress) {
SimpleDateFormat sdf = new SimpleDateFormat( "dd/MM/yyyy HH:mm:ss" );
// Recupera o retorno
txtStatus.setText( sdf.format( new Date() ) + " - " + progress[0] );
}
@Override
protected void onPreExecute() {
super.onPreExecute();
exibirProgressbar( true );
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute( aBoolean );
exibirProgressbar( false );
Log.i( "onPostExecute : ", "passou" );
}
};
String dados = ("#" + conta + "," + phoneNumber + "," + latitude + "," + longitude + "," + evento + "," + status + "," + DataTime + "$");
st.execute( dados );
}
An attempt was this way :
int len=1;
byte[] receivedBytes = new byte[len]; // len é o tamanho da resposta esperada
int total = 0;
while (total < len)
{
byte[] objectAsByte = new byte[socket.getReceiveBufferSize()];
int pctsize = is.read(objectAsByte);
System.arraycopy(objectAsByte, 0, receivedBytes, total, pctsize);
total += pctsize;
}
if(receivedBytes.length != -1){
String response = new String(receivedBytes);
publishProgress( response );
}
"when you enter buffData = is.read( Buff, 0, 2048 ); it pauses the thread" - the method
read()
is blocking, if it has not read all the amount of bytes requested it pauses the thread to wait I/O. You have to do a check of how much data it should read or maybe set a stop character.– Piovezan
Could you give me an example? I don’t know where to implect or how to control.
– user65509
Well, let’s search on the internet read() and how it behaves...
– user65509
It’s hard to understand, does anyone have an example ? I hope to get a "@" character back; I actually get it. The method should already be satisfied with this and go to closure in Finish; but it will not.
– user65509
I tried this but gave endless loop while (buffData != -1) { String Response = new String( Buff ); // Send data to Main publishProgress( Response ); if(!Sponse.contains( "@" )) { buffData = is.read( Buff, 0, 2048 ); } }
– user65509