Olá, estou tentando fazer com que duas aplicações rodando na mesma máquina se comuniquem via sockets. Criei duas classes: Server e Client, uma para cada aplicação. A idéia é que tanto o Server quanto o Client executem paralelamente às respectivas aplicações, servindo apenas como uma interface de comunicação, porém estou tendo problemas para fazer isso funcionar (exceções do tipo “java.net.ConnectException: Connection refused: connect”, etc). Se possívvel, gostaria que alguém me ajudasse a entender melhor qual o problema.
Obrigado.
publicclassServerimplementsRunnable{ServerSocketserverSocket;publicServer(intport)throwsException{serverSocket=newServerSocket(port);newThread(this).start();System.out.println("Server listening to port:"+port);}publicvoidrun(){try{Socketsocket=serverSocket.accept();System.out.println("Client connected!");BufferedReadermessage=null;while(true){message=newBufferedReader(newInputStreamReader(socket.getInputStream()));if(message.readLine()=="a"){//do something}elseif(message.readLine()=="b"){//do something else}elseif(message.readLine()=="close"){socket.close();}else{System.out.println(message.readLine());}}}catch(Exceptione){e.printStackTrace();System.out.println("Server: Connection error.");}}}
publicclassTestClientextendsThread{privateStringserver;privateintport;publicTestClient(Stringserver,intporta){this.server=server;this.port=porta;}publicstaticvoidmain(String[]args){try{Stringserver="localhost";intport=1030;newTestClient(server,port).start();}catch(Exceptione){System.out.println("Client error.");e.printStackTrace();}}publicvoidrun(){try{while(true){Socketsocket=newSocket(server,port);System.out.println("Conectado a "+server+":"+port);ObjectOutputStreamobjectOutputStream=newObjectOutputStream(socket.getOutputStream());objectOutputStream.writeObject("-message-");socket.close();}}catch(Exceptione){e.printStackTrace();}}}
Cara, por coincidencia tava estudando isso numa apostila da Caelum agorinha.
Eu alterei a porta para “80” e se u programa rodou.
Acredito que tenha alguma configuração de rede sua que esteja barrando o acesso à porta que você configurou.
Abraços,
E
edu12345
valeu!
vou testar aqui e já posto o resultado xD!
essa apostila é free? se for, tem como indicar o link ou algo assim?
No final tem um apendice que fala da API de Sockets. Tem um exemplo que acredito que seja o que você procura.
Não sei o que você quer exatamente, mas se quer so comunicar duas apps entre elas nem precisava usar Threads. Dá uma olhada no pdf que você vai entender.
Não funcionou só trocando a porta para 80. Na verdade ainda não consegui fazer funcionar totalmente como eu queria. A idéia é utilizar esta comunicação para ligar uma aplicação a um simulador, onde serão modificados valores de sensores, portanto tenho que poder enviar mensagens pelo cliente (aplicação) e receber respostas do servidor (simulador) a qualquer momento. É neste ponto que tenho dificuldades, já que a comunicação funciona e depois parece cair. Caso alguém tenha um exemplo de algo parecido, por favor poste. Obrigado.
S
soaresinfo
Já tentou trocar localhost por 127.0.0.1?
E
edu12345
Resolvi o problema. Não precisei trocar o localhost. Não sei como fazer upload de arquivos, então estou postando o código aqui. Talvez seja útil para alguém que queira implementar uma comunicação simples baseada em mensagens. Como tive que fazer isso rápido, talvez (muito provavelmente) não seja a melhor implementação possível, mas está funcionando. Estou postando os códigos tanto do cliente quanto do servidor. Vale lembrar que utilizei essa comunicação para conectar uma aplicação a um simulador de hardware, então o cliente está com o nome de HardwareInterface, pois ele foi usado como uma interface de comunicação com os sensores e atuadores simulados e acessíveis através do servidor. As mensagens e os métodos do cliente também estão definidas em função disso (getValue - para ler sensores; setValue - para passar parâmetros para atuadores; error; e acknowledge message - ack). As mensagens podem ser alteradas dependendo do protocolo que for utilizado.
Servidor:
importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.net.ServerSocket;importjava.net.Socket;classServer{StringGET_VALUE_MSG="getvalue";StringSET_VALUE_MSG="setvalue";StringERR_MSG="error";StringACK_MSG="ack";intport=7020;Socketsocket;StringorderMessage=null;StringidentifierMessage=null;publicvoidrun(){try{ServerSocketserverSocket=newServerSocket(port);System.out.println("Aguardando conexao...");socket=serverSocket.accept();System.out.println("Conectado com "+socket.getRemoteSocketAddress());listen(socket.getInputStream());}catch(IOExceptione){System.out.println("Problemas na comunicação: ");e.printStackTrace();System.exit(1);}}publicvoidsendToClient(Stringmessage)throwsIOException{DataOutputStreamoutput=newDataOutputStream(socket.getOutputStream());output.writeInt(message.length());for(charch:message.toCharArray())output.writeChar(ch);output.flush();}privateStringprocessMessage(Stringmessage){StringreturnToClient="error";// ...returnreturnToClient;}privatevoidlisten(finalInputStreaminputStream){newThread(newRunnable(){DataInputStreamdataImputStream=newDataInputStream(inputStream);publicvoidrun(){try{while(true){intsize=dataImputStream.readInt();intcont=0;char[]chars=newchar[size];while(cont<size){chars[cont]=dataImputStream.readChar();cont=cont+1;}StringreceivedMessage=newString(chars);Stringresult=ERR_MSG;try{result=processMessage(receivedMessage);}catch(Exceptione){//handles exception}sendToClient(result);}}catch(IOExceptione){}}}).start();}}
Cliente:
importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.InetSocketAddress;importjava.net.Socket;importjava.net.UnknownHostException;importjava.util.Scanner;publicclassHardwareInterface{privateStringGET_VALUE_MSG="getvalue";privateStringSET_VALUE_MSG="setvalue";privateStringERR_MSG="error";privateStringACK_MSG="ack";privateSocketsocket;publicHardwareInterface(Stringhost,intport)throwsException{try{socket=newSocket();socket.connect(newInetSocketAddress(host,port));}catch(UnknownHostExceptione){System.out.println("Unknown host");System.out.println("Host: "+host);System.out.println("Port: "+port);thrownewException(e);}catch(IOExceptione){thrownewException("Connection to hardware failed.");}}privatevoidsendMessage(Stringmessage)throwsIOException{DataOutputStreamoutput=newDataOutputStream(socket.getOutputStream());Stringline="";line=message;output.writeInt(line.length());for(charch:line.toCharArray())output.writeChar(ch);output.flush();}privateStringwaitResponse()throwsIOException{StringmessageReceived;DataInputStreamdataInputStream=newDataInputStream(socket.getInputStream());intsize=dataInputStream.readInt();intcont=0;char[]chars=newchar[size];while(cont<size){chars[cont]=dataInputStream.readChar();cont=cont+1;}messageReceived=newString(chars);returnmessageReceived;}publicintgetHardwareValue(Stringidentifier)throwsException{intvalue;Stringresponse;this.sendMessage(GET_VALUE_MSG);response=this.waitResponse();if(response.equals(ACK_MSG)){this.sendMessage(identifier);response=this.waitResponse();value=Integer.parseInt(response);}else{thrownewException("Hardware not found.");}returnvalue;}publicvoidsetHardwareValue(Stringidentifier,intvalue)throwsException{Stringresponse;this.sendMessage(SET_VALUE_MSG);response=this.waitResponse();if(response.equals(ACK_MSG)){this.sendMessage(identifier);response=this.waitResponse();if(response.equals(ACK_MSG)){this.sendMessage(String.valueOf(value));this.waitResponse();}}else{thrownewException("Connection to hardware failed.");}}}