Olá 
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.
Obrigado pela ajuda.
cara, confesso q nao conheco python, mas ACHO q nao eh preciso serializar uma string, basta apenas envia-la na saida e pronto!
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:
[code]public class Servidor extends Thread{
private PrintWriter writer; // output stream to client
private BufferedReader reader; // input stream from client
private ServerSocket server; // server socket
private Socket conexao; // connection to client
private int port;
@Override
public void run() {
try // set up server to receive connections; process connections
{
if(server != null)
server.close();
port = 1992;
while(server == null || server.getLocalPort() == -1){
try{
server = new ServerSocket(port); // create ServerSocket
server.setReuseAddress(true);
} catch (BindException e){ //caso a porta ja esteja em uso.
port++;
}
}
System.out.println("Servidor conectado pela porta " + port);
PrintWriter p = new PrintWriter(new FileWriter("port.txt"), true);
PrintWriter p2 = new PrintWriter(new FileWriter("../../port.txt"), true);
p.print(port);
p.close();
p2.print(port);
p2.close();
try {
esperarConexao(); // wait for a connection
iniciarStreams(); // get input & output streams
receber(); // process connection
} // end try
catch(EOFException ex){
System.out.println("Conexão com o cliente encerrada");
} // end catch
finally {
fecharConexao(); // close connection
} // end finally
} // end try
catch(IOException ex){
Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
} // end catch
} // end method run
private void esperarConexao() throws IOException {
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());
}
private void iniciarStreams() throws IOException {
writer = new PrintWriter(conexao.getOutputStream());
writer.flush(); // flush output buffer to send header information
// set up input stream for objects
reader = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
System.out.println("Streams inicializados");
this.enviar("Streams inicializados");
}
private void receber() throws IOException {
String message = "";
do // process messages sent from client
{
try {
if(message != null){
message = reader.readLine();
System.out.print("RECEBIDO >> " + message); // display message
if(message.split("/").length == 2) {
Main.addRank(message);
}
}
message = "";
} catch(Exception e){
this.fecharConexao();
}
} while(!conexao.isClosed());
}
public void fecharConexao() {
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 try
catch(IOException ex){
Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
} // end catch
}
// send message to client
public void enviar(String message) {
writer.println(message);
System.out.println("ENVIADO >> " + message);
} [/code]
e em python…
[quote]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”[/quote]
se vc for trafegar somente strings usa a classe Scanner, ela é otima para fazer esse tipo de serviço.
Sim, vou transmitir somente strings… Como eu uso Scanner com socket?
Scanner scanner = new Scanner(seu_socket.getOutputStream());
while(scanner.hasNext()){
scanner.next(); // retorna string
}