Bom dia, preciso montar uma espécie de “Google Drive” utilizando UDP, ou seja, uma aplicação P2P com funções de servidor e cliente para a transferência de arquivos entre peers. Como vai ser um teste local não preciso me preocupar com a autenticação e descoberta automática de peers, pois vou usar uma lista com os IPs dos computadores que irei me conectar. Já definimos um protocolo de comunicação, contudo não estou conseguindo fazer a transferência de arquivos .txt de volta para o cliente e as outras funcionalidades do Drive.
Até o momento monteis as seguintes classes:
Cliente:
import java.io.*;
import java.net.*;
import java.util.Arrays;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
class Cliente {
public static void main(String args[]) throws Exception {
int count = 0;
int tamanho = 1048;
DatagramSocket clientSocket = new DatagramSocket();
String servidor = "localhost";
int porta = 9876;
InetAddress IPAddress = InetAddress.getByName(servidor);
byte[] sendData = new byte[tamanho];
Scanner scan = new Scanner(System.in);
int opcao = -1;
while (opcao != 3) {
menu();
opcao = scan.nextInt();
switch (opcao){
case 1:
String sentense = "" + opcao;
sendData = sentense.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
System.out.println("Enviou opçao 1..");
File file = selectFile();
String nomeArquivo = file.getName();
System.out.println("Nome do arquivo " + nomeArquivo);
sentense = file.getName();
System.out.println("sentence " + sentense);
sendData = sentense.getBytes();
System.out.println("SendData " + sendData);
sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
System.out.println("SendPacket " + sendPacket);
clientSocket.send(sendPacket);
System.out.println("Enviou o nome..");
FileInputStream input = new FileInputStream(file);
int tamanhoArquivo = 0;
while((count = input.read(sendData)) != -1){
tamanhoArquivo += count;
}
int numeroPacotes = tamanhoArquivo/tamanho;
System.out.println("numeroPacotes " + numeroPacotes);
input.close();
System.out.println("---------- Mandando arquivo -----------");
FileInputStream input2 = new FileInputStream(file);
while((count = input2.read(sendData)) != -1 ){
System.out.println(new String(sendData));
sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
System.out.println("sendData: " + sendData + " sendData.length: " + sendData.length + " IPAddress " + IPAddress);
System.out.println("sendPacket do while " + sendPacket);
clientSocket.send(sendPacket);
System.out.println("Enviando arquivo para o servidor..");
}
break;
case 2:
break;
}
}
}
public static File selectFile() throws FileNotFoundException {
JFileChooser fileChooser = new JFileChooser("C:/Users/Pasta");
int result = fileChooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
String filename = fileChooser.getSelectedFile().getPath();
System.out.println(filename);
File file = new File(filename);
// Get the size of the file
return file;
} else if (result == JFileChooser.CANCEL_OPTION) {
JOptionPane.showMessageDialog(null, "Nenhum arquivo foi selecionado!");
} else if (result == JFileChooser.ERROR_OPTION) {
JOptionPane.showMessageDialog(null, "Erro ao selecionar o arquivo!");
}
return null;
}
private static void menu() {
System.out.println("1- Enviar Arquivo para o Servidor");
System.out.println("2- Baixar arquivo do Servidor");
System.out.println("3- Sair");
}
}
Servidor:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.ArrayList;
class Servidor {
public static void main(String args[]) throws IOException {
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] recData = new byte[1024 * 16];
int i = 0;
ArrayList<File> arquivos = new ArrayList<File>();
while (true) {
System.out.println("Servidor está esperando");
DatagramPacket recPacket = new DatagramPacket(recData, recData.length);
System.out.println("recPacket criado com DatagramPacket -> " + recPacket);
serverSocket.receive(recPacket);
System.out.println("recPacket recebido -> " + recPacket);
String opcao = new String(recData);
opcao = opcao.substring(0, 1);
if ("1".equals(opcao)) {
System.out.println("Recebeu opção 1..");
recPacket = new DatagramPacket(recData, recData.length);
serverSocket.receive(recPacket);
String nomeArquivo = (new String(recData));
System.out.println("Recebeu o nome.." + nomeArquivo);
FileWriter file = new FileWriter("C:/Users/Pasta/teste.txt");
PrintWriter out = new PrintWriter(file);
recPacket = new DatagramPacket(recData, recData.length);
System.out.println("recPacket depois do PrinWriter -> " + recPacket);
serverSocket.receive(recPacket);
System.out.println("Enviou o arquivo..");
out.write(new String(recData), 0, recPacket.getLength());
System.out.println("\nPacket" + ++i + " written to file\n");
out.flush();
} else {
System.out.println("else");
}
}
}
}
No momento o cliente pede pro servidor, o servidor envia de volta, só que o cliente não está recebendo o arquivo, como eu faço para ele receber o arquivo e fazer as validações?
Obrigado.