• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pedrotuga

Qual a forma mais facil de enviar texto por um socket

16 mensagens neste tópico

O que é que queres mais simples que uma stream?

Que eu saiba, na plataforma standard não existe nada que te possa ajudar, mas como aquilo é enorme é possível que exista alguma classe que me tenha escapado.

Bibliotecas externas não conheço.

Aliás, um socket é uma stream, basta escreveres para ela.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usando streams não me parece complicado...

Socket s = new Socket("localhost",4567);
OutputStream os = s.getOutputStream();
os.write(str.getBytes());

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Condensando:

s.getOutputStream().write(str.getBytes());

Queres algo mais simples em que sentido?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Queria mais simples no sentido em que depois de aberto o socket podia pegar numa string e envia-la para lá.

Assim tenho que abrir uma string, escrever e depois fecha-la.

Mas já estou a ver que é mesmo assim que isto funciona.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Queria mais simples no sentido em que depois de aberto o socket podia pegar numa string e envia-la para lá.

Mas é isso mesmo que fazes, não precisas de mais nada, embora possa ser útil criar uma stream em torno do socket, não precisas mais do que o socket aberto, depois é só escreveres o texto que queres.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é bem isso que se faz, o que se faz é criar uma stream e escrever nela.

Pensei que a classe socket tivesse membros tipo

Socket.read()

Socket.write()

Mas não tem.

Obrigado pelas respostas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só crias a stream se quiseres, já que um socket, se esqueceres os pormenores de porto/url e manutenção de ligação, é no fundo uma stream, ou melhor um par de streams. Estas são criadas por ti, automaticamente, na abertura do socket, e não precisas mais que escrever directamente para elas, se quiseres algo mais elaborado e menos de baixo nível que as streams de bytes então podes criar uma stream de alto nível a partir de uma destas duas.

O teu socket.write() não é mais que socket.getOutputStream().write().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok... fiz uma pequena experiencia e está aqui qualquer coisaa falhar-me pois este programa fica-me eternamente à espera de não sei o quê.

 try {
            Socket cliente = new Socket("localhost", 80);

            PrintWriter out = new PrintWriter(cliente.getOutputStream(),true);
            BufferedReader in = new BufferedReader(new InputStreamReader(cliente.getInputStream()));

            String pedido = "GET /\n\n";
            out.print(pedido);

            String resposta = in.readLine();

            System.out.printf(resposta);

            out.close();
            in.close();
            cliente.close();

        } catch (Exception exception) {
        
            System.out.println("problemazinhos da treta");
            System.exit(1);
            
        }

O que é que estou aqu a fazer mal?

Uma coisa irritante, há certas instruções que têm obrigatóriamente que ser embrulhadas num try... catch, o que é bastante irritante quando se está fazer pequenas experiencias.

Tinha ideia que era o meu IDE (netbeans) que me obrigava a isto, mas dá-me erros ao compilar :(

Já agora... abrindo um socket desta forma, há alguma maneira de definir um timeout?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse código bloqueia porque não está ninguém do outro lado a enviar uma resposta. Qualquer função read vai bloquear até obter uma resposta ou até passar o tempo definido, se não houver tempo, vai bloquear eternamente.

Para colocares o timeout de um socket basta invocares o método setSoTimeout, e passares o valor inteiro que represente os milissegundos de espera antes de um timeout, convém fazeres isto antes de tentares ler qualquer coisa.

Quanto às excepções, diria que a maioria das APIs de IO em Java têm excepções declaradas que o programador é obrigado a apanhar e tratar. E não há forma de dar a volta a isso, é algo que faz parte da plataforma, habitua-te a tratar as excepções e nunca a deixares que essas cheguem aos utilizadores, que é esse o objectivo.

Já agora, que depois de ler o que escrevi é que me dão assim umas luzes :(, estás a escrever para a stream de saída mas não estás a escrever efectivamente, isto é, não estás a fazer um flush, ora o servidor do outro lado não recebe qualquer pedido e por isso não devolve qualquer resposta, faz lá um flushzito :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esse método não existe no meu java.net.Socket

tenho o java 1.6 não sei se esse método foi descontinuado ou o que se passou, vou procurar uma alternativa.

Mas eu tenho o apache na porta 80, devia responder qq coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O método existe desde o 1.2, tens de ter!

E o facto do apache não responder é porque não lhe chega pedido nenhum, já te disse porquê :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ops... apaguei a última resposta e não não o devia fazer.

For the record: era um errozito estúpido que eu estava a fazer.

ok... então agora esotu a ler os dados assim:

while((line = in.readLine())!= null){
                    resposta += line + "\n";
                }

já que o o readLine foi o único método que encontrei que devolve uma string.

Agora uma coisa que não estou a perceber... estou a testar isto com pedidos HTTP. Isto está a funcionar e tal mas não consigo ver os headers... não estou a perceber porque é que não aparecem :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para obteres uma resposta correcta tens de formatar um pedido correcto, por exemplo:

out.println("GET http://localhost/devteam/ HTTP/1.1");
out.println("Host: localhost:80");
out.println("Connection: Close");
out.println();

Repara que sigo o protocolo HTTP para fazer o pedido, inclusive incluir a linha em branco para terminar o cabeçalho. Se atalhares caminho, por exemplo colocando apenas o método GET com o endereço que queres, acabas por receber uma resposta que pode não conter os cabeçalhos ou até podes nem receber resposta.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acrescentando só dois pontos: eu li a resposta anterior antes de a teres apagado, não há problema; e concatenação de strings como estás a fazer não é propriamente a forma mais eficiente, é até bastante ineficiente. Se passares esse tipo de código para produção, onde tenhas de concatenar várias vezes uma string optar por usar um StringBuffer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora