0
I created the server part and the client part. If the message exchange is just an input and an output works perfectly, the problem is to maintain a communication without closing the socket.
In case I send a message to the server, it responds by confirming receipt. On the customer side I send a confirmation of receipt and the server then sends the result of the operation.
Is there any way to make the server-side reading method wait for a new entry? When I do the reading again the method ends up reading the first entry of the customer, as there has not been made a new entry. Could help me ?
Just follow my code...
Client
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import javax.xml.rpc.ServiceException;
public class Cliente {
public static void main(String[] args) throws Exception {
try {
Socket socket = new Socket("localhost", 40005);
String resposta = null;
String mensagem = "#Jose Alvaro#";
socket.setSoTimeout(18000);
socket.setTcpNoDelay(true);
DataOutputStream saida = new DataOutputStream(socket.getOutputStream());
BufferedReader entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
resposta = enviarSolicitacaoExecucao(entrada, saida, mensagem);
System.out.println(resposta);
enviarConfirmacaoRecebimentoResposta(entrada, saida, mensagem, resposta);
resposta = lerResposta(entrada, (char) 0);
System.out.println(resposta);
socket.close();
/*
* if(StringUtil.isNull(resposta)){
* System.out.println("Resposta é nula"); }
*/
// resposta = limparBinariosResposta(resposta);
} catch (IOException e) {
System.out.println(e);
}
}
private static String lerResposta(BufferedReader entrada, char charactereEsperado) throws IOException {
StringBuilder respostaBuilder = new StringBuilder();
String resposta = null;
char[] charBuffer = new char[8192];
int bytesLidos = 0;
do {
try {
bytesLidos = entrada.read(charBuffer);
} catch (Exception e) {
System.out.println("Erro" + e.getMessage());
}
respostaBuilder.append(new String(charBuffer, 0, bytesLidos).trim());
} while (charactereEsperado != 0 && charBuffer[bytesLidos - 1] != charactereEsperado);
resposta = respostaBuilder.toString();
// System.out.println(resposta);
return resposta;
}
private static void enviarConfirmacaoRecebimentoResposta(BufferedReader entrada, DataOutputStream saida,
String mensagem, String resposta) throws IOException, ServiceException {
/*
* if (!validarConfirmacaoRecebimento(mensagem.getId(), resposta)) {
* System.out.
* println("Resposta não contem confirmação de recebimento do EOC"); }
*
*/ String confirmacao = "2 requisicao" + "\n";// mensagem.montarConfirmacao();
saida.writeBytes(confirmacao);
}
private static String enviarSolicitacaoExecucao(BufferedReader entrada, DataOutputStream saida, String mensagem)
throws IOException {
String resposta = null;
String solicitacao = ",,,..PRATPR";
saida.writeBytes(solicitacao + "\n");
resposta = lerResposta(entrada, (char) 0);
return resposta;
}
}
Server:
public static void main(String[] args) {
try {
// Cria um SocketServer (Socket característico de um servidor)
ServerSocket socket = new ServerSocket(40005);
System.out.println("Socket iniciado OK");
while(true) {
Socket connectionSocket = socket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
// Cria uma stream de sáida para retorno das informações ao cliente
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
(new ServidorSoc(connectionSocket,inFromClient,outToClient )).start();
}
}
catch(Exception e){
System.out.println(e);
}
}
}
public void run() {
try {
boolean continuar = true;
while (continuar) {
int cont = 1;
String entrada = lerResposta(inFromClient, (char) 0);
confirmacaoRec = retornarId(entrada) + confirmacaoRec;
// System.out.println(entrada);
// converte a resposta pra byte
byte[] retorno = confirmacaoRec.getBytes();
// escreve a mensagem no cliente
outToClient.write(retorno);
while (continuar) {
try {
sleep(10000);
// inFromClient.wait();
retornoCliente = lerResposta(inFromClient, (char) 0);
if (!entrada.equals(retornoCliente)) {
retorno = resp.getBytes();
outToClient.write(retorno);
continuar = false;
}
// System.out.println("Confirmação de recebimento" +
// retornoCliente);
// if (retornoCliente != entrada && retornoCliente !=
// null) {
// System.out.println(retornoCliente);
// }
// }
// sleep(1000);
} catch (Exception e) {
System.out.println(e);
}
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
private String retornarId(String entrada3) {
String[] s = entrada3.split("#");
String resul = s[1];
return resul.substring(0, 5);
}
private static String lerResposta(BufferedReader entrada, char charactereEsperado) throws IOException {
StringBuilder respostaBuilder = new StringBuilder();
String resposta = null;
char[] charBuffer = new char[8192];
int bytesLidos = 0;
do {
try {
bytesLidos = entrada.read(charBuffer);
// System.out.println(bytesLidos);;
} catch (Exception e) {
System.out.println("Erro" + e.getMessage());
}
respostaBuilder.append(new String(charBuffer, 0, bytesLidos).trim());
} while (charactereEsperado != 0 && charBuffer[bytesLidos - 1] != charactereEsperado);
resposta = respostaBuilder.toString();
// System.out.println(resposta);
return resposta;
}
}
While this link may answer the question, it is best to include the essential parts of the answer here and provide the link for reference. Replies per link only can be invalidated if the page with the link is changed. - Of Revision
– hugocsl
Thanks for the feedback @hugocsl , improved the response.
– WindsBrain