Problemas com sockets

2 respostas
D

Olá pessoal do fórum. Sou novo por aqui e também como programador.
Estou desenvolvendo uma aplicação que envia comandos para um servidor remoto. Construi a aplicação e talz, só que quando vou enviar a mensagem, preciso enviar várias vezes para o comando ser recebido pelo servidor e também, alguns comandos ficam armazenados no buffer, o que dificulta para passar os próximos comandos.

package javateste;

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class NewMain {

    public static void main(String[] args) {

        Socket socket = null;
        DataInputStream dis;
        PrintStream dos = null;
        Scanner entrada;
        BufferedReader bfr = null;
        InputStreamReader re;

        try {
            socket = new Socket("192.168.60.209", 23);
            if (socket.isConnected()) {
                System.out.println("Conectado");
            }
            bfr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            dos = new PrintStream(socket.getOutputStream());

            entrada = new Scanner(System.in);
            while (entrada.hasNextLine()){
            dos.println(entrada.nextLine());
                         
            StringBuffer msg = new StringBuffer (bfr.readLine());
             
            if (msg!=null){
               
                System.out.println(msg);
                msg.setLength (0);
           
            }
           
            }


        } catch (Exception e) {
            System.out.println(e);
        }

        try {
            bfr.close();
            dos.close();
            socket.close();
        } catch (Exception e) {
            System.out.println("Erro ao encerrar a conexão");
        }
    }
}

Vocês poderiam me ajudar?

2 Respostas

soaresinfo

O que acontece é o stream esperando o buffer encher para poder enviar a informação. Como os comandos devem ser pequenos, eles não são enviados na hora. Chama o método flush do seu stream para que a informação seja enviada independente do buffer estar cheio.

B

Todo programa com sockets que precisa trabalhar em modo conversacional (ou seja, um lado manda só uma quantidade pequena de dados, e depende do outro lado mandar uma confirmação) deve setar o modo do socket para TCP_NODELAY = true.

http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setTcpNoDelay(boolean)

Criado 13 de agosto de 2012
Ultima resposta 13 de ago. de 2012
Respostas 2
Participantes 3