Bom, acho que isso é a ultima coisa que falta pra terminar meu projeto. Eu gostarria de saber como eu posso fazer uma conexão socket de java (servidor) pra python (client). Ja tentei de quase tudo…
Bom, vamos as duvidas…
Eu tento serializar uma string no python com o modulo pickle, metodo dump(). O problema é que a string chega toda estranha. Por exemplo: eu envio a String “Olá”. Ela chega assim: .S’Ol\xc1’0p . Se eu mando um “BLABLA”, vem .S’BLABLA’0p … Sempre. Gostaria de saber se tem como eu normalizar a string, porque desse jeito ela vem certinho. Não queria usar replace, porque parece uma solução muito errada, e que pode modificar strings que não venham estranhas
Se eu não mandar serializada, ela chega. Estou usando BufferedReader como OutputStream.
cara, confesso q nao conheco python, mas ACHO q nao eh preciso serializar uma string, basta apenas envia-la na saida e pronto!
A
Arthur.hvt
Então... O problema é que eu envio ela sem serializar, e o readLine() não recebe. Mas o read() consegue pegar. Isso que não da pra entender... Vou colocar aqui meu codigo:
publicclassServidorextendsThread{privatePrintWriterwriter;// output stream to clientprivateBufferedReaderreader;// input stream from clientprivateServerSocketserver;// server socketprivateSocketconexao;// connection to clientprivateintport;@Overridepublicvoidrun(){try// set up server to receive connections; process connections{if(server!=null)server.close();port=1992;while(server==null||server.getLocalPort()==-1){try{server=newServerSocket(port);// create ServerSocket server.setReuseAddress(true);}catch(BindExceptione){//caso a porta ja esteja em uso.port++;}}System.out.println("Servidor conectado pela porta "+port);PrintWriterp=newPrintWriter(newFileWriter("port.txt"),true);PrintWriterp2=newPrintWriter(newFileWriter("../../port.txt"),true);p.print(port);p.close();p2.print(port);p2.close();try{esperarConexao();// wait for a connectioniniciarStreams();// get input & output streamsreceber();// process connection}// end trycatch(EOFExceptionex){System.out.println("Conexão com o cliente encerrada");}// end catchfinally{fecharConexao();// close connection}// end finally}// end trycatch(IOExceptionex){Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE,null,ex);}// end catch}// end method runprivatevoidesperarConexao()throwsIOException{System.out.println("Esperando Conexão");conexao=server.accept();// allow server to accept connection conectou=true;System.out.println("Conexão recebida de: "+conexao.getInetAddress().getHostName());}privatevoidiniciarStreams()throwsIOException{writer=newPrintWriter(conexao.getOutputStream());writer.flush();// flush output buffer to send header information// set up input stream for objectsreader=newBufferedReader(newInputStreamReader(conexao.getInputStream()));System.out.println("Streams inicializados");this.enviar("Streams inicializados");}privatevoidreceber()throwsIOException{Stringmessage="";do// process messages sent from client{try{if(message!=null){message=reader.readLine();System.out.print("RECEBIDO >> "+message);// display messageif(message.split("/").length==2){Main.addRank(message);}}message="";}catch(Exceptione){this.fecharConexao();}}while(!conexao.isClosed());}publicvoidfecharConexao(){System.out.println("Conexão do servidor encerrada");try{if(writer!=null){writer.close();// close output stream}if(reader!=null){reader.close();// close input stream}if(conexao!=null){conexao.close();// close socket}}// end trycatch(IOExceptionex){Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE,null,ex);}// end catch}// send message to clientpublicvoidenviar(Stringmessage){writer.println(message);System.out.println("ENVIADO >> "+message);}
e em python..
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost",1992))
s.send("BlaBLã")
except socket.error:
"Conexão não estabelecida"
M
mauricioadl
se vc for trafegar somente strings usa a classe Scanner, ela é otima para fazer esse tipo de serviço.
A
Arthur.hvt
Sim, vou transmitir somente strings… Como eu uso Scanner com socket?
M
mauricioadl
Scanner scanner = new Scanner(seu_socket.getOutputStream());