11. april 2005 - 19:47Der 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); }
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?
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?
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(); }
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.