Se você escreve com writeChar, então precisa fazer a leitura com readChar.
Ok,obrigado …
=)
fiz um for e li char por char …
como estarei passando um array-list de um lado pro outro, ou seja, bastante string´s, sabe me dizer se tem uma forma mais otimizada pra ler (ou até mesmo transmitir) essas strings´?
obrigado como sempre por antecipação …
No fundo a informação vai ser transmitida de uma vez só. O socket fará isso por baixo, carregando em buffers. Você no fundo está lendo de um buffer também, então, não há tanto problema assim.
Se tiver, você pode usar buffers de software, associando ao seu socket um BufferedInputSTream e um BufferedOutputStream.
muito obrigado pela atenção !!
muito mesmo …
Pelo que vi, se for apenas uma String que você qeur enviar, pode usar o writeUTF(minhaString) ao inves do writeChars(minhaString). Quando for receber, usa o readUTF() que ele deve ler a mensagem que você digitou.
Eu estou precisando fazer algo assim, só que eu quero, ao invés de enviar uma mensagem (uma String), enviar um arquivo. Alguém tem ideia de como fazer um protocolo nesse modelo?
Enviar o tamanho do arquivo e o arquivo
Do outro lado, receber o tamanho do arquivo, alocar o que for necessário e receber o arquivo, guardando em algum diretório.
Pode parecer fácil, mas estou enrolado para fazer isso… Alguém pode dar uma ajuda aí?
Não é muito diferente. Use o DataInputStream para enviar um int com quantos bytes serão transmitidos. Então, use o método write para escrever byte-a-byte.
Do outro lado, dê um readInt para saber quantos bytes você vai ler, e leia byte-a-byte.
Opa, e aí galera, beleza?
Será que alguém poderia me dar uma ajuda com uma situação estranha que estou tendo com SOCKET no Android, por favor.
Eu tenho o seguinte código dentro de uma Thread, quando eu uso o IP 192.168.0.104 e envio “.”, o servidor retorna uma String normalmente, porem se eu usar outro IP o servidor não retorna a String, a execução do programa para na linha dentro do while, simplesmente para, não entra na exeption nem nada, para de executar mesmo.
Porem, se eu executar qualquer IP no putt com telnet ou no aplicativo que foi feito para IOS funciona normalmente também. Apenas no Android está com esse problema.
Alguém saberia o que pode ser?
//Instancia as view's e recupera o IP e PORTA do EditText
textIn = (TextView) findViewById(R.id.txtAlerta);
editTextIp = (EditText) findViewById(R.id.editTextIp);
editTextPort = (EditText) findViewById(R.id.editTextPort);
String ip = editTextIp.getText().toString();
int port = Integer.parseInt( editTextPort.getText().toString() );
//Instancia socket, entrada e saída
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
//Verifica se existe um novo dispositivo com o IP e PORTA informados e retorna sucesso ou exception
try {
socket = new Socket(ip, port);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream.writeUTF(".");
dataOutputStream.flush();
//Verifica se readLine possui algum texto e exibe quando encontrar
BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
do {
readLine = buffer.readLine();
}while(readLine == null || !readLine.substring(0, 1).equals("%"));
final String readAux = readLine;
//Fecha janela de progress
progressDialog.dismiss();
final TextView txxt = (TextView) ActivitySettings.this.findViewById(R.id.aaaaaaaaa);
txxt.post(new Runnable() {
@Override
public void run() {
txxt.setText(String.valueOf( readAux ));
}
});
} catch (Exception e) {
String message = "Dispositivo não encontrado ou o WIFI está desligado.";
showToast(message);
Log.e("Socket", e.getMessage());
e.printStackTrace();
}
finally{
//Fecha entrada se estiver aberta
if(dataInputStream != null){
try {
dataInputStream.close();
} catch (Exception e2) {
String message = "Não foi possível fechar a conexão de entrada.";
showToast(message);
}
}
//Fecha saída se estiver aberta
if(dataOutputStream != null){
try {
dataOutputStream.close();
} catch (Exception e2) {
String message = "Não foi possível fechar a conexão de saída.";
showToast(message);
}
}
//Fecha socket se estiver aberto
if(socket != null){
try {
socket.close();
} catch (Exception e2) {
String message = "Não foi possível fechar a conexão com socket.";
showToast(message);
}
}
//Fecha janela de progress
progressDialog.dismiss();
}
Valeu pessoal
Alguém saberia o que pode ser?
Acho que minha dúvida se encaixa aqui.
Tenho um projeto de servidor/cliente, o servidor trabalhará independente, o cliente será somente um tipo de janela para os comando executados no servidor, o cliente não terá acesso ao código, somente as informações vindas do servidor. (Um tipo de comparação seria seu navegador acessando um site PHP, você tem controle do navegador, mas não tem controle do conteúdo do site).
Pensei em usar RMI, mas tem um detalhe, certas decisões do servidor dependerão das decisões tomadas pelos clientes conectados, com o servidor RMI isso dificulta muito, e pelo que entendi, o ServerSocket seria a melhor opção.
Agora uma dúvida quanto a comunicação cliente/servidor:
Quais são as opções confiáveis?
Pensei em criar uma tabela com possíveis comandos, não seria nada muito complicado, somente uma lista de caracteres e o significado de cada caractere para o servidor, dessa forma, quando o cliente mandar um “00” o servidor saberá que isso significa null, quando enviar 0F o servidor pegará a data atual, e assim por diante.
(um exemplo bem básico seria o SimpleChat do ViniGodoy, quando recebe “EXIT” ele desconecta o cliente)
Existe algum modo mais eficiente de ter um controle do servidor através de um cliente sem ter acesso ao código do mesmo por um Socket?
Li sobre o que o ViniGodoy escreveu, e fiquei na dúvida, o que seria exatamente um “Protocolo”?
Um padrão de mensagens entre servidor/cliente?
Obrigado!
Boa tarde ViniGodoy, desculpa ressuscitar o tópico, mas estou precisando muito de uma ajuda.
Gostaria de saber como ficaria a parte do servidor nesse seu exemplo com mais de uma string.
Na verdade eu preciso enviar do cliente para o servidor vários arquivos, sendo enviados um de cada vez,
a cada iteração, junto com o arquivo estou enviando um md5 do arquivo para testar se o arquivo foi enviado corretamente.
Portanto, eu tenho q enviar o arquivo e o md5, validar se o arquivo foi enviado ok, e retornar um true ou false pro cliente.
se true ele pode excluir o arquivo senão o arquivo não é excluido.
Acho que consegui explicar o q eu preciso. Se puderem me dar uma força eu ficarei mto grato.
Atenciosamente,
Rafael.