olá pessoal, tenho um código socket que funciona porém, após receber a resposta do servidor não consigo enviar uma nova mensagem, apenas se eu fechar o app e abri-lo novamente. alguém poderia me apontar a solução? Sou iniciante em programação android então desculpem qualquer coisa.
segue código do cliente:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.*;
import android.view.View;
import android.widget.TextView;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private Button btnSend;
private TextView txtStatus;
private TextView txtValor;
private TextView txtHostPort;
private SocketTask st;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSend = (Button) findViewById(R.id.btnSend);
txtStatus = (TextView) findViewById(R.id.txtStatus);
txtValor = (TextView) findViewById(R.id.txtValor);
txtHostPort = (TextView) findViewById(R.id.txtHostPort);
btnSend.setOnClickListener(btnConnectListener);
}
private View.OnClickListener btnConnectListener = new View.OnClickListener() {
public void onClick(View v) {
// Recupera host e porta
String hostPort = txtHostPort.getText().toString();
int idxHost = hostPort.indexOf(":");
final String host = hostPort.substring(0, idxHost);
final String port = hostPort.substring(idxHost + 1);
// Instancia a classe de conexão com socket
st = new SocketTask(host, Integer.parseInt(port), 5000) {
@Override
protected void onProgressUpdate(String... progress) {
SimpleDateFormat sdf = new SimpleDateFormat(
"HH:mm:ss");
// Recupera o retorno
txtStatus.setText(sdf.format(new Date()) + " - "
+ progress[0]);
}
};
st.execute(txtValor.getText() == null ? "" : txtValor.getText()
.toString(), ""); // Envia os dados
}
};
@Override
protected void onDestroy() {
super.onDestroy();
st.cancel(true);
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import android.os.AsyncTask;
import android.util.Log;
import static java.lang.System.out;
/**
* Created by DMP01 on 29/10/2017.
*/
public abstract class SocketTask extends AsyncTask<String, String, Boolean> {
private Socket socket;
private InputStream is;
private OutputStream os;
private String host;
private int port;
private int timeout;
/**
* Construtor com host, porta e timeout
*
* @param host
* host para conexão
* @param port
* porta para conexão
* @param timeout
* timeout da conexão
*/
public SocketTask(String host, int port, int timeout) {
super();
this.host = host;
this.port = port;
this.timeout = timeout;
}
/**
* Envia dados adicionais se estiver conectado
*
* @param data
* dados addicionais
* @throws IOException
*/
public void sendData(String data) throws IOException {
if (socket != null && socket.isConnected()) {
os.write(data.getBytes());
}
}
@Override
protected Boolean doInBackground(String... params) {
boolean result = false;
try {
SocketAddress sockaddr = new InetSocketAddress(host, port);
socket = new Socket();
socket.connect(sockaddr, timeout); // milisegundos
if (socket.isConnected()) {
publishProgress("CONECTADO");
is = socket.getInputStream();
os = socket.getOutputStream();
for (String p : params) {
os.write(p.getBytes("ISO-8859-1"));
}
byte[] buff = new byte[2048];
int buffData = is.read(buff, 0, 2048);
while (buffData != -1)
{
String response = new String(buff);
publishProgress(response);
buffData = is.read(buff, 0, 2048);
}
} else {
publishProgress("CONNECT ERROR");
}
} catch (IOException e) {
publishProgress("ERROR");
Log.e("SocketAndroid", "Erro de entrada e saida", e);
result = true;
} catch (Exception e) {
publishProgress("ERROR");
Log.e("SocketAndroid", "Erro generico", e);
result = true;
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (socket != null) {
socket.close();
}
} catch (Exception e) {
Log.e("SocketAndroid", "Erro ao fechar conexao", e);
}
}
return result;
}
}