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
Funcionamento:
[color=red]Cliente pede lista de arquivos[/color]
o Servidor Central pede a lista dos arquivos para cada servidor conectado
o Servidor Central consolida a lista e devolve ao cliente
Cliente pede para copiar um arquivo do servidor
Servidor Central pede a cada um dos outros outros servidores quem possui o arquivo
O servidor que possuir o arquivo responde dizendo seu IP e Porta
O Servidor Central responde ao cliente o IP e Porta do servidor que possui o arquivo
O Cliente conecta no servidor que possui o arquivo pedindo o arquivo
O Servidor envia o arquivo ao cliente.
Cliente envia um arquivo
Servidor Central sorteia aleatoriamente um servidor para hospedar o arquivo
Servidor Central envia ao Cliente o IP e Porta do Servidor que irá hospedar o arquivo
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…
x111
Abril 22, 2013, 6:06pm
#4
Bom, pelo que você colocou o Servidor principal é cliente dos servidores segundários.
O usuário(cliente) se conecta ao Servidor Principal.
O usuario solicita a lista de arquivos ao servidor principal
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.
Apos receber de todos os servidores ele pega a lista na qual armazenou os arquivos do servidor e retonra para o cliente!
x111
Abril 22, 2013, 8:03pm
#6
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 ?
x111
Abril 23, 2013, 2:14pm
#10
Você pode usar o OutPutStream e o InPutStream para isso!