Avatar billede x-masman Nybegynder
11. april 2005 - 19:47 Der er 8 kommentarer og
1 løsning

UDP i java

Hej hoveder,

Jeg sidder og roder med noget UDP i java og har nogle spørgsmål.

Hvis man forestiller sig en UDP server alla dette:

import java.net.*;

class STUNServerUDP extends Thread implements Runnable{

    protected DatagramSocket sock;

    // Constructer   
    public STUNServerUDP(int port){
    try{
        sock = new DatagramSocket(port);
    } catch(Exception e) {
        System.out.println
        ("Error creating Datagram Socket in class STUNServer: "+e);
    }
    }

    // Accessors and mutators
    public DatagramSocket getSocket(){ return sock;}
    public void setSocket(DatagramSocket s){ sock = s;}

    // Methods

    // Start listening on the given port
    public void run(){
    // create input buffer
    System.out.println("Starting STUNServerUDP");
    try{
        byte[] inputBuffer = new byte[sock.getReceiveBufferSize()];
        DatagramPacket dp =
        new DatagramPacket(inputBuffer,inputBuffer.length);
        // Server loop
        while(true){
        sock.receive(dp);
        InetAddress remoteAddress = dp.getAddress();
        int remotePort = dp.getPort();
        String s = remoteAddress + ";";
        DatagramPacket returnPacket =
            new DatagramPacket(s.getBytes(),s.getBytes().length,
                      remoteAddress, remotePort);
            sock.send(returnPacket);
        }
   
    }catch(Exception e){
        System.out.println("Error in STUNServerUDP: " + e);
    }
    }
}

1. Hvad vil der så ske, hvis serveren modtager en UDP pakke imens den er imellem receive og send. Altså i gang med at behandle en tidligere modtaget pakke?

2. Hvis man laver en multithreaded UDP server, så har jeg læst mig frem til, at serveren ofte lytter på en port og når den egentlige session begynder flyttes denne til en anden port. Vil man ikke få problemer med firewalls ved dette? Ofte tillader en firewall jo ikke at en ekstern IP sender pakker til en ny port.

Det jeg skal nå frem til, er en server, der modtager UDP pakker på en given port og sender et svar tilbage med afsenderens IP adresse. Da der kan være flere brugere af servicen, skal der jo tages højde for dette. Men hvordan gør jeg det bedst?
Avatar billede arne_v Ekspert
11. april 2005 - 20:24 #1
re 1)

receive er blocking

modtagne pakker bliver gemt indtil de bliver receivet af applikationen

ved høj load kan det være nødvendigt at øge størrelsen på bufferen
Avatar billede arne_v Ekspert
11. april 2005 - 20:26 #2
re 2)

jo

jeg mener heller ikke at teknikken er så almindelig

man dispatcher bare fra en receive tråd til andre tråde i stedet for
Avatar billede x-masman Nybegynder
11. april 2005 - 21:36 #3
re 1)

Men pakkerne vil generelt blive modtaget og så længe at behandlingen af pakken ikke tager mere end et par millisekunder så skulle der ikke være noget problem. eller?

re 2)

"man dispatcher bare fra en receive tråd til andre tråde i stedet for"

Har du et eksempel på det? man overfører jo ikke socketen til en ny tråd som ved en tcp forbindelse. Vil det ikke skabe et problem, hvis man modtager pakker sammentidigt? Altså jeg laver en lytte tråd med en socket. Når denne socket modtager en datagramPacket, sender den pakken videre til en handler tråd. Når denne har håndteret pakken åbner den en ny socket på samme port, for at sende. Vil der så ikke være et problem med to sockets på samme port eller er jeg helt ude i hampen her?
Avatar billede arne_v Ekspert
11. april 2005 - 21:43 #4
re 1)

Afhænger jo af hvormange der kommer per sekund.

re 2)

Du har en tråd som modtager data pakkerne og straks sende dem videre
til andre tråde til processing.
Avatar billede x-masman Nybegynder
11. april 2005 - 21:58 #5
Sådan her: ?

import java.net.*;

class STUNServerUDP extends Thread implements Runnable{

    protected DatagramSocket sock;

    // Constructer   
    public STUNServerUDP(int port){
    try{
        sock = new DatagramSocket(port);
    } catch(Exception e) {
        System.out.println
        ("Error creating Datagram Socket in class STUNServer: "+e);
    }
    }

    // Accessors and mutators
    public DatagramSocket getSocket(){ return sock;}
    public void setSocket(DatagramSocket s){ sock = s;}

    // Methods

    // Start listening on the given port
    public void run(){
    // create input buffer
    System.out.println("Starting STUNServerUDP");
    try{
        byte[] inputBuffer = new byte[sock.getReceiveBufferSize()];
        DatagramPacket dp =
        new DatagramPacket(inputBuffer,inputBuffer.length);
        // Server loop
        while(true){
        sock.receive(dp);
        new Thread(new ProcessUDPStunPacket(dp)).start();
        }
   
    }catch(Exception e){
        System.out.println("Error in STUNServerUDP: " + e);
    }
    }
}

class ProcessUDPStunPacket extends Thread implements Runnable{

    DatagramPacket dp;
    int port;
   
    ProcessUDPStunPacket(DatagramPacket p,port){
    dp = p;
    this.port = port;
    }

    public void run(){
    InetAddress remoteAddress = dp.getAddress();
    int remotePort = dp.getPort();
    String s = remoteAddress + ";";
    DatagramPacket returnPacket =
        new DatagramPacket(s.getBytes(),s.getBytes().length,remoteAddress,
                  remotePort);
    DatagramSocket sock = new DatagramSocket(port);
    sock.send(dp);
    }
}
Avatar billede x-masman Nybegynder
11. april 2005 - 21:59 #6
Her opretter man jo en ny socket på samme port for at sende det.
Avatar billede arne_v Ekspert
11. april 2005 - 22:22 #7
du kunne også bruge samme socket men med noget synchronized

eller i.s.f. en ny tråd hver gang en queue og et antal worker threads (som evt.
havde hver sin socket til at send'e på)

der er mange muligheder
Avatar billede x-masman Nybegynder
11. april 2005 - 23:06 #8
OK. Tak for hjælpen arne. Smid et svar.
Avatar billede arne_v Ekspert
12. april 2005 - 09:47 #9
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester