Ir para o conteúdo
pedrotuga

Qual a forma mais facil de enviar texto por um socket

Mensagens Recomendadas

pedrotuga    31
pedrotuga

Aqui no site da sun:

http://java.sun.com/docs/books/tutorial/networking/sockets/readingWriting.html

no tutorial, o exemplo usa streams para enviar dados. Pode funcionar muito beme tal, mas não há nada assim mais directo. Tipo.. eu quero enviar uma string por um socket, não existe nenhum método que simplesmente me envie uma string para um socket?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

Usando streams não me parece complicado...

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

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().

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

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 :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

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ê :(

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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 :(

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

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.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade