Trabalho sobre socket - comunicação

Olá pessoal preciso fazer um trabalho sobre Socket e tenho duvida na seguinte situação.

Para entender melhor vou descrever a estrutura:

Cliente

  • pede lista de arquivos
  • enviar arquivo
  • baixa arquivo

ServidorCentral

  • disponibiliza lista atualizada ao cliente

Servidores

  • armazenam arquivos

Funcionamento:

  1. [color=red]Cliente pede lista de arquivos[/color]

  2. o Servidor Central pede a lista dos arquivos para cada servidor conectado

  3. o Servidor Central consolida a lista e devolve ao cliente

  4. Cliente pede para copiar um arquivo do servidor

  5. Servidor Central pede a cada um dos outros outros servidores quem possui o arquivo

  6. O servidor que possuir o arquivo responde dizendo seu IP e Porta

  7. O Servidor Central responde ao cliente o IP e Porta do servidor que possui o arquivo

  8. O Cliente conecta no servidor que possui o arquivo pedindo o arquivo

  9. O Servidor envia o arquivo ao cliente.

  10. Cliente envia um arquivo

  11. Servidor Central sorteia aleatoriamente um servidor para hospedar o arquivo

  12. Servidor Central envia ao Cliente o IP e Porta do Servidor que irá hospedar o arquivo

  13. O Cliente se conecta neste Servidor e envia o arquivo.

O servidor central deve suportar múltiplos clientes.

Minha duvida é como eu monto esta estrutura de troca de informação entre [color=red] cliente x ServidoCentral (item1) [/color]

Seja mais objetivo. O que já tentou fazer?

Tem bastante material sobre sockets no forum.

Só dar uma procurada…

Bom, pelo que você colocou o Servidor principal é cliente dos servidores segundários.

  1. O usuário(cliente) se conecta ao Servidor Principal.
  2. O usuario solicita a lista de arquivos ao servidor principal
  3. Ao receber a lista de arquivos o servidor principal se conecta a cada servidor segundário e pede a lista de arquivos. Após receber se desconecta desse servidor, armazena a lista recebida e parte para o próximo.
  4. Apos receber de todos os servidores ele pega a lista na qual armazenou os arquivos do servidor e retonra para o cliente!

Exatamente X@ndy !

Então o tópico está resolvido?

Não, agora eu preciso codificar isso ! Esse é o problema do tópico !

Hoje a noite postarei mais detalhadamente a minha necessidade pois assim fica muito geral.

Desde já agradeço pela colaboração

Olá Galera !

Vamos lá como havia comentado vou postar a evolução do código sobre o assunto descrito.

ClienteLista

[code]
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;

public class ClienteLista {

public static void main(String[] args) throws UnknownHostException, IOException{
	Socket client = new Socket("localhost", 21000);
	DataOutputStream out = new DataOutputStream(client.getOutputStream());
	out.writeInt(1);
	System.out.println(new DataInputStream(client.getInputStream()).readUTF());
	client.close();
}	

}[/code]

ServerCentral

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;


public class ServerCentral {
	
	public static void main(String args[]) throws IOException {
		ServerSocket server = new ServerSocket(21000);
		while(true) {
			Socket s = server.accept();
			DataInputStream in = new DataInputStream(s.getInputStream());
			DataOutputStream out = new DataOutputStream(s.getOutputStream());
			int comando = in.readInt();
			
			comando = 1;
						
			switch (comando) {
				case 1:
					
					Socket client = new Socket("localhost", 22000);
					DataOutputStream out2 = new DataOutputStream(client.getOutputStream());
					out2.writeInt(1);
					DataInputStream in2 = new DataInputStream(client.getInputStream());
					StringBuilder retorno = new StringBuilder();
					while (true) {
						String arquivo = in2.readUTF();
						if (arquivo.equals("break"))
							break;
						retorno.append(arquivo + "\n");				
					}
					out.writeUTF(retorno.toString());					
					break;
				case 2:
					break;
			}
			s.close();
		}
	}
}

Server

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;


public class Server {
	
	public static void main(String[] args) throws UnknownHostException, IOException{
		
		ServerSocket server = new ServerSocket(22000);
		ArrayList<String> list = new ArrayList<String>();
		File diretorio = new File("C:\\Users\\jnoise\\Desktop\\A");  
		
	    String [] arquivos = diretorio.list();
	    
		while(true) {
			Socket s = server.accept();
			DataInputStream in = new DataInputStream(s.getInputStream());
			DataOutputStream out = new DataOutputStream(s.getOutputStream());
			int comando = in.readInt();
			switch (comando) {
				case 1:
					for(int i=0; i<arquivos.length; i++) {  
				        out.writeUTF(arquivos[i]);
				    } 
					out.writeUTF("break");
					break;
			}
		}
	}
}

Esta é a primeira parte que contempla o retorno da lista dos arquivos dos servidores (server) pelo ServerCentral para o ClienteLista.

Agora preciso implementar o upload e o download de arquivos para o cliente.

Alguma ideia de como eu posso fazer esta implementação se existe alguma biblioteca que me ajude ?

Você pode usar o OutPutStream e o InPutStream para isso!