1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problema com Java Socket, atualiza no segundo recebimento

Bom dia galera estou com um problema em um servidor que estou desenvolvendo aqui. Programa: Recebe dados tcp e exibe na tela as Strings recebidas.

Problema: Exibe a primeira quando recebe a segunda, e assim por diante. Ex:(enviando de 10 em 10 segundos) 12:00:00 eu envio a primeira String, 12:00:10(envio a segunda) e exibe na tela a primeira ainda, 12:00:20(envio a terceira) exibe a segunda e por ai vai..

Segue o código:

public class Server extends JFrame {
    public Server() {

            }

  private static ServerSocket serverSocket = null;
  private static Socket clientSocket = null;

  private static final int maxClientsCount = 10;
  private static final clientThread[] threads = new clientThread[maxClientsCount];

  public static void main(String args[]) {

    int portNumber = 1234;
    if (args.length < 1) {

    } else {
      portNumber = Integer.valueOf(args[0]).intValue();
    }

    try {
      serverSocket = new ServerSocket(portNumber);
    } catch (IOException e) {
      System.out.println(e);
    }

    while (true) {
      try {
        clientSocket = serverSocket.accept();
        int i = 0;
        for (i = 0; i < maxClientsCount; i++) {
          if (threads[i] == null) {
            (threads[i] = new clientThread(clientSocket, threads)).start();
            break;
          }
        }
        if (i == maxClientsCount) {
          PrintStream os = new PrintStream(clientSocket.getOutputStream());
          os.println("Server too busy. Try later.");
          os.close();
          clientSocket.close();
        }
      } catch (IOException e) {
        System.out.println(e);
      }
    }
  }

}

class clientThread extends Thread {

  private DataInputStream is = null;
  private PrintStream os = null;
  private Socket clientSocket = null;

  public clientThread(Socket clientSocket, clientThread[] threads) {
    this.clientSocket = clientSocket;
  }

  public void run() {

    try {
      is = new DataInputStream(clientSocket.getInputStream());
      os = new PrintStream(clientSocket.getOutputStream());
      //System.out.println("Enter your name.");
      //String name = is.readLine().trim();

      while (true) {
        String line = is.readLine();
        if(line != null){
            System.out.println(line);
        }
        else{
            is.close();
        }
      }

    } catch (IOException e) {
        System.out.println("nulo");
    }
  }
}

Vlww

  • Você já ouviu falar de setTcpNoDelay()? Ele costuma ajudar nesses problemas de sockets que se usam para "conversar". http://www.rgagnon.com/javadetails/java-0294.html

    entanglement   22 de jul de 2013
  • Então, mas o problema não seria com Delay do socket e sim com a maneira com que eu estou imprimindo os dados na tela, estou fazendo algo de errado. Ele deve estar recebendo depois de imprimir ai fica guardado e imprime na próxima, algo assim.

    Gustavo Ton Max   22 de jul de 2013
  • TCP_NODELAY não tem nada a ver com delay de socket. É uma coisa relacionada ao algoritmo de Nagle, que dá problemas quando você tem que enviar um dado para um socket, e depois ler a resposta. Quando você seta TCP_NODELAY para true, você desabilita o algoritmo de Nagle.

    entanglement   25 de jul de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java sockets threads ou faça a sua própria pergunta.