简体   繁体   English

在Java中通过UDP传输文件

[英]Transfer a file through UDP in java

I have the following algorithm implemented in Java which uses TCP/IP: 我在使用TCP / IP的Java中实现了以下算法:

-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. 现在,我在使用UDP数据包实现它时遇到了麻烦。 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;
        }
    }
}

This certainly can be done using UDP datagrams. 当然,这可以使用UDP数据报来完成。 However, it is going to be a bit more difficult since UDP itself does not offer reliability or ordered packet delivery. 但是,由于UDP本身不提供可靠性或有序的数据包传送,因此将更加困难。 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. 如果选择使用UDP,则需要编写额外的代码来完成此操作。 Are you sure you really want to use UDP at all? 您确定您真的要使用UDP吗?

If you choose TCP much like your example above, you won't need to worry about bytes getting there and in the correct order. 如果您像上面的示例一样选择TCP,则无需担心字节以正确的顺序到达那里。

I would begin by examining some examples at Sun Datagram Tutorial 首先,我将研究Sun Datagram教程中的一些示例

I recommend to review the UDP protocol ( RFC 768 ) and then use some base example. 我建议检查UDP协议( RFC 768 ),然后使用一些基本示例。 There are lots of example with UDP and Java (eg Java Tutorials -> Networking ) UDP和Java有很多示例(例如Java教程->网络

我同意Daniel H的观点。您还应该专门查看java.net.DatagramSocket

I'm wondering if you're getting confused between TCP and UDP ? 我想知道您是否对TCP和UDP感到困惑? Your code references TCP in its class names etc. but you're talking about UDP ? 您的代码在类名中引用了TCP等,但是您在谈论UDP? These are distinct protocols both using IP, but with distinct characteristics re. 这些都是使用IP的不同协议,但是具有不同的特征。 reliability/fragmentation/duplication etc. 可靠性/碎片化/复制等

See here for differences. 看到这里的差异。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM