views:

1421

answers:

4

I have the following algorithm implemented in Java which uses TCP/IP:

-Client request a file
-Server checks if the file exists
  - if do: send contents of the file to the client
  - if not: send "file not found" msg to the client

Now I`m having trouble implementing that using UDP Datapackets. Here is my code:


CLIENT:

package br.com.redes.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import br.com.redes.configuration.CommonKeys;

public class TCPClient {
    public static void exibirCabecalho(){
     System.out.println("-------------------------");
     System.out.println("TCP CLIENT");
     System.out.println("-------------------------");
    }

    public static void main(String[] args) throws IOException {

     TCPClient.exibirCabecalho();

     Socket echoSocket = null;
     PrintWriter out = null;
     BufferedReader in = null;

     if (args.length != 1){
      System.out.println("O Programa deve ser chamado pelo nome + nome do servidor");
      System.out.println("Ex: java TCPClient localhost");
      System.exit(1);
     }

     System.out.println("Conectando ao servidor...");
     try {
      echoSocket = new Socket( args[0] , CommonKeys.PORTA_SERVIDOR);
      out = new PrintWriter(echoSocket.getOutputStream(), true);
      in = new BufferedReader(new InputStreamReader(echoSocket
        .getInputStream()));
     } catch (UnknownHostException e) {
      System.err.println("Host não encontrado (" + args[0] + ")");
      System.exit(1);
     } catch (IOException e) {
      System.err.println("Erro ao inicializar I/O para conexao");
      System.exit(1);
     }

     System.out.println("Conectado, digite 'sair' sem as aspas para finalizar");

     BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
     String userInput;

     while ((userInput = stdIn.readLine()) != null) {
      out.println(userInput);
      String inputLine = in.readLine(); 

      if (inputLine == null){
       System.out.println("Servidor terminou a conexão.");
       System.out.println("Saindo...");
       break;
      }

      System.out.println("Servidor: " + inputLine.replace("\\n", "\n"));
     }

     out.close();
     in.close();
     stdIn.close();
     echoSocket.close();
    }

}


SERVER:

package br.com.redes.server;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import br.com.redes.configuration.CommonKeys;

public class TCPServer {
    public static void exibirCabecalho(){
     System.out.println("-------------------------");
     System.out.println("TCP SERVER");
     System.out.println("-------------------------");
    }

    public static void main(String[] args) throws IOException {

     TCPServer.exibirCabecalho();
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket( CommonKeys.PORTA_SERVIDOR );
        } catch (IOException e) {
            System.err.println("Erro ao iniciar servidor na porta: " + CommonKeys.PORTA_SERVIDOR );
            System.exit(1);
        }

        System.out.println("Iniciando servidor na porta: " + CommonKeys.PORTA_SERVIDOR);
        System.out.println("Aguardando cliente...");
        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.err.println("Erro ao receber conexoes.");
            System.exit(1);
        }

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

        String inputLine, outputLine;

        System.out.println("Cliente conectado, aguardando caminhos pra leitura...");
        while ((inputLine = in.readLine()) != null) {

            if (inputLine.equalsIgnoreCase("sair")) {
             System.out.println("Sair detectado, fechando servidor...");
             break;
            }

            outputLine = processar(inputLine);
             out.println(outputLine);
        }
        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }

    private static String processar(String inputLine) {
     final String ARQUIVO_NAO_ENCONTRADO = "arquivo não encontrado.";
     final String ARQUIVO_IO = "erro ao ler arquivo.";

     System.out.println("Procurando arquivo: " + inputLine);
     File f = new File(inputLine);
     try {
      BufferedReader input =  new BufferedReader(new FileReader(f));
      String linha = null;
      StringBuffer retorno = new StringBuffer();

      retorno.append("\\n");
      retorno.append("Arquivo encontrado, lendo conteudo: " + inputLine + "\\n");
      while (( linha = input.readLine()) != null){
               retorno.append(linha  + "\\n");
            }
      retorno.append("fim da leitura do arquivo\\n");
      return retorno.toString();
     } catch (FileNotFoundException e) {
      return ARQUIVO_NAO_ENCONTRADO;
     } catch (IOException e) {
      return ARQUIVO_IO;
     }
    }
}
+1  A: 

I recommend to review the UDP protocol (RFC 768) and then use some base example. There are lots of example with UDP and Java (e.g. Java Tutorials -> Networking)

Daniel H.
+1  A: 

I agree with Daniel H. You should also specifically look at java.net.DatagramSocket.

Matthew Flaschen
+1  A: 

I'm wondering if you're getting confused between TCP and UDP ? Your code references TCP in its class names etc. but you're talking about UDP ? These are distinct protocols both using IP, but with distinct characteristics re. reliability/fragmentation/duplication etc.

See here for differences.

Brian Agnew
I know both are differents, the example is the code I'm having trouble with passing to udp usage instead TCP.
Kamia
+2  A: 

This certainly can be done using UDP datagrams. However, it is going to be a bit more difficult since UDP itself does not offer reliability or ordered packet delivery. Your application needs these features to deliver a file to the client. If you choose to use UDP, you will need to write extra code to accomplish this. Are you sure you really want to use UDP at all?

If you choose TCP much like your example above, you won't need to worry about bytes getting there and in the correct order.

I would begin by examining some examples at Sun Datagram Tutorial

Gary
Exactly the info i was needed for, I'll read it. This a java test for a friend of mine, the tcp worth 7 of 10, the rest 3 is in UDP, i wish her got a 10 score :/
Kamia