Conexão Socket Java-Python

5 respostas
A

Olá :smiley:

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.

5 Respostas

M

cara, confesso q nao conheco python, mas ACHO q nao eh preciso serializar uma string, basta apenas envia-la na saida e pronto!

A

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:

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);
    }

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

se vc for trafegar somente strings usa a classe Scanner, ela é otima para fazer esse tipo de serviço.

A

Sim, vou transmitir somente strings… Como eu uso Scanner com socket?

M

Scanner scanner = new Scanner(seu_socket.getOutputStream());

while(scanner.hasNext()){

scanner.next(); // retorna string

}
Criado 6 de julho de 2011
Ultima resposta 7 de jul. de 2011
Respostas 5
Participantes 2