[Dicas exemplo] Socket em Java + GEL + UDP!

Opa e ai galera blz?

Seguinte estava precisando fazer uma aplicação em Socket para envio de arquivos, ai queria se pudessem me passar um exemplo de Socket UDP que garanta entrega dos dados por nome, ou seja eu iria no caso criar duas classes “Servidor” e “Usuario” em Java, para isto preferi usar o Gel pelo fato de eu depois compilar via Prompt mais facilmente e assim deixar o servidor executando em 2º plano. Bom continuando eu entregaria os dados por nome, inserindo um nome e assim que o servidor pegaria esta requisição e começava a enviava para o Cliente (eu pensei na possibilidade de os arquivos ficarem na raiz do “C:” assim como a pasta “Socket” que tem as duas classes a serem compiladas via Prompt e se não fosse possivel eu pensei na ideia de ele fosse pegando os arquivos por nome ja predefinidos dos arquivos ex: “arq1.jpg”, “arq2.jpg”, “arq3.jpg” ate 5 um exemplo.

Bom um exemplo do que vi em Socket TCP (o que queria como exemplo teria que ser UDP), eu criei e compilei no Gel (pelo fato de ele não precisar criar pacotes para depois serem abertos como o NetBeans e o Eclipse) ja que ele cria somente as classes .java, um exemplo Cliente.java:

[code]import java.io.;
import java.net.
;

class cliente {
public static void main(String args[])
{
try {
// conecta no servidor (local) na porta 2000
Socket sock = new Socket(“127.0.0.1”,2000);
// associa o fluxo de entrada do socket à variável entrada
BufferedReader entrada = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String dataHora = entrada.readLine(); //obtem dados do servidor (data/hora)
System.out.println("\nData/hora no servidor “+dataHora+”\n");
sock.close(); // encerra a conexao
}
catch(java.io.IOException ex) {
System.out.println(ex.getMessage());
}
}
}[/code]

E o Servidor:

[code]import java.io.;
import java.net.
;
import java.util.Date;

class servidor {
public static void main(String args[])
{
try {
// Cria um socket de servidor e fica escutando na porta 2000
ServerSocket s = new ServerSocket(2000);
while(true) {
System.out.println("\nEsperando conexão");
Socket conexao = s.accept(); // espera a chegada de uma conexão
// e a aceita quando chegar
System.out.println("\nConectado!");
//obtem o fluxo de saida do socket e o associa à variável saida
PrintStream saida = new PrintStream(conexao.getOutputStream());
saida.println( (new Date()).toString() );
conexao.close();
}
}
catch(java.io.IOException ex) {
System.out.println(ex.getMessage());
}
}
}[/code]

Ai mandei compilar via prompt de comando com o servidor em segundo plano via arquivos em .BAT, exemplos:

[B]javac servidor start /b java servidor[/B]

Bom como não necessito teoricamente de interface e pela possibilidade de compilar o servidor em 2º plano (ja que estou testando somente no meu PC no momento) pelo Prompt (este tb ate me informa a linha com erro pelo que puder ver), preferi usar o Gel e “jogar” a pasta “Socket” para a raiz “C:” e assim compilar.

Então se alguem puder me dar uns exemplos para o que eu preciso fazer (visto que isto que estou pedindo é bem mais simples o que preciso fazer, mais ja me daria uma noçaõ melhor de Scoket em UDP com reconhecimento de envio e arquivos sendo pegos)… flw a todos e vlw!!!

UDP mais arquivos? É bem mais complicado que parece. Aliás, é muito complicado mesmo (a menos que você goste de perder dados, o que provavelmente não é o que você pretende ao transmitir arquivos).

Você tem de se lembrar das seguintes coisas:

a) Pacotes UDP podem ser perder, vir fora de sequência, ou mesmo vir repetidos.

b) Um pacote UDP pode conter no máximo 1400 e poucos bytes (dependendo da sua infraestrutura de rede). Se você simplesmente testar em uma rede local, pode achar que até cabem mais dados em um pacote UDP, mas o que ocorre (quando o pacote tem de passar por um roteador, ou pior, trafegar na Internet) é que o pacote acaba vindo truncado para esse valor de 1400 e poucos bytes sem aviso. O tipico caso “funcionava lá em casa mas aqui deu pau”. E pior, isso não dá para ser resolvido trivialmente. Não é uma coisa que dá para resolver com um simples bandeide.

c) O programa que recebe os pacotes tem de processá-los o mais rapidamente possível, porque os drivers de rede não ficam “acumulando os pacotes recebidos em uma fila”. Em vez disso, se seu programa não pegar o pacote na hora em que foi recebido, e se outro pacote chegar pela rede, você irá simplesmente perder o pacote anterior. Argh

d) Você precisa ter um mecanismo para retransmitir pacotes perdidos ou fora de sequência.

e) Talvez você tenha de dar uma pausa entre um pacote transmitido ou outro, o que pode até tornar sua transmissão mais lenta (não mais rápida) que usar um socket TCP simples.

Portanto, prepare-se para levar tudo isso em conta quando for usar UDP. Pesquise bastante na Internet sobre “multicast” também.

Aqui está a descrição completa de uma implementação de transmissão de arquivos simples usando UDP, chamada TFTP.
Mas como na internet os problemas que o entanglement citou são potencializados, não recomendo usar isso aí.

Aliás, para tratar todos esses problemas é que o TCP foi criado. É praticamente impossível criar um protocolo UDP que seja mais eficiente.

Um uso comum para UDP (Multicast) + Arquivos é quando você quer copiar um arquivo para N máquinas ao mesmo tempo. Isso é feito, por exemplo, em um dos modos de instalação do Norton Ghost (você designa uma máquina como a servidora da imagem a ser difundida pela rede, e cada máquina que vai receber a imagem deve então ficar escutando os pacotes UDP. Portanto, se você tiver 20 ou mais máquinas em uma rede que devem ser instaladas ao mesmo tempo, esse modo de transferência de arquivos compensa a complexidade do uso do UDP.

Vlw pelas dicas entanglement e ViniGodoy.
Seguinte eu comecei um codigo me baseando em de exemplos de UDP ainda não faz muita coisa a não ser um envio de string de palavras. Mais eu so estou conseguindo compila-lo via Prompt, onde ate informa os erros. Bom abaixo um problema que estou tento com o Gel agora (como sabem o Gel pode não criar pacotes e somente classes como estou fazendo):

Exception Exception: Error creating process : 2

-classpath “C:\Arquivos de programas\Java\jdk1.6.0_07\jre\lib\rt.jar;C:\Docum ents and Settings\AMD X2\Meus documentos\GelProjects\Sockets” cliente
Error occurred,please check settings

Abaixo o que eu fiz de apontamento para tentar tirar o erro que persiste:

Alguem saberia como tirar este erro para eu conseguir compilar, mesmo usando o Gel?
A sim, e mais uma coisa, esse TFTP não possui exemplos de codigo não né?

Flw e vlw a todos!!!

Por que é que você quer usar tanto o Gel? É simples você pegar o que foi feito no Eclipse ou NetBeans e fazer rodar em uma linha de comando. Basta entender o que deve ser feito.

[quote=babylon]V
A sim, e mais uma coisa, esse TFTP não possui exemplos de codigo não né?
[/quote]

O link que lhe foi dado é para a especificação. Se quiser uma implementação em Java, baixe os fontes de:

http://commons.apache.org/net/

[quote=entanglement][quote=babylon]V
A sim, e mais uma coisa, esse TFTP não possui exemplos de codigo não né?
[/quote]

O link que lhe foi dado é para a especificação. Se quiser uma implementação em Java, baixe os fontes de:

http://commons.apache.org/net/
[/quote]

Vlw pelo link entanglement, vai ser de grande ajuda.

Quanto ao Gel, é pq eu to criando as classes sem pacotes, ate para ficar mais facil compilar ja que testo via Prompt de comando, ai so localizo a pasta, os arquivos e mando ir compilando para depois executar. Bom não sei muito bem mexer no Netbeans para compilar aplicações desse tipo, eu tinha testado uma de exemplo TCP que mesmo eu executando os arquivos no Netbeans, as classes Main ou que faz rodar o programa não deu em nada, ai por isso me disseram para começar usar o Gel (eu to fazendo ainda uma meio que gambiarra, testo os codigos quanto a erros no Netbeans e depois passo os codigos para o Gel somente como Classe tirando as dependencias de Packpages bem como as varias pastas, e como ta dando erro no Gel sei la pq, compilo via Prompt mesmo ja sabendo que o codigo esta certo).

Acho que o pessoal aqui não usa o Gel não né (vi que ele deixa ate compilar outras linguagens) ? :frowning:

Flw e vlw novamente!!!