/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
UDP virker ikke i mit serverprogram
Fra : Kim Voss Schrader


Dato : 14-04-04 19:25

Hej!

Jeg har et lille javaprogram, som sender UDP-pakker til en mikrocontroller -
virker fint. Nu har jeg overført denne kode til et lille serverprogram, som
modtager data fra en applet (via en socketforbindelse), og meningen er, at dette
skal sendes videre via UDP til mikrocontrolleren.

Programmet fejler dog i "kompileringen", og der meldes, at 'udp_socket'-symbolet
ikke kan findes/resolves. Samme skete for 'address' indtil jeg flyttede koden
ned i linje 95 (se filen i zip-arkivet).

Nogen der gider hjælpe mig lidt videre? Jeg synes det hele er gjort som
beskrevet på div. hjemmesider, så jeg ved snart ikke hvad problemet skulle være
:(

Der skulle vel ikke være noget til hindring for at kunne sende UDP-pakker til et
valgfrit IP-nummer fra serverprogrammet? Det er jo ikke underlagt
restriktionerne i en applet.

Koden er her: http://www.student.dtu.dk/~s960674/Server.zip

På forhånd tak!

PS: Det er kun tekstfiler og der er således ikke virus i :)
--
Mvh, Kim Voss Schrader

OBS: Der kan max. attaches 30kb i e-mails til mig, ellers bouncer de.

 
 
Rolf Thorup (14-04-2004)
Kommentar
Fra : Rolf Thorup


Dato : 14-04-04 20:09

Kim Voss Schrader wrote:
> Hej!
>
> Jeg har et lille javaprogram, som sender UDP-pakker til en mikrocontroller -
> virker fint. Nu har jeg overført denne kode til et lille serverprogram, som
> modtager data fra en applet (via en socketforbindelse), og meningen er, at dette
> skal sendes videre via UDP til mikrocontrolleren.
>
> Programmet fejler dog i "kompileringen", og der meldes, at 'udp_socket'-symbolet
> ikke kan findes/resolves. Samme skete for 'address' indtil jeg flyttede koden
> ned i linje 95 (se filen i zip-arkivet).

Hmm, kunne du ikke poste et minimalt virkende (i dit tilfælde ikke
virkende) eksempel, med den kode du har problemer med. Jeg tror de
fleste som eller kunne hjælpe er tilbageholdende hvis de først skal til
at hente en zip-fil, udpakke og så først derefter tjekke koden.

Mvh Rolf

Kim Voss Schrader (14-04-2004)
Kommentar
Fra : Kim Voss Schrader


Dato : 14-04-04 20:22

Hej!

Rolf Thorup wrote:
>
> Hmm, kunne du ikke poste et minimalt virkende (i dit tilfælde ikke
> virkende) eksempel, med den kode du har problemer med. Jeg tror de
> fleste som eller kunne hjælpe er tilbageholdende hvis de først skal til
> at hente en zip-fil, udpakke og så først derefter tjekke koden.

Hmm, kodeeksemplet er faktisk ret minimalt i forvejen, men ok:

public class ComThread extends Thread {
....
static final int udp_port = 8481;
static final String udp_ip = "192.168.0.100";
....
public void run() {
try {InetAddress udp_address = InetAddress.getByName (udp_ip);}
       catch(UnknownHostException e) {}
try {DatagramSocket udp_socket = new DatagramSocket ();}
       catch(SocketException e) {}
....
(her bliver count og message genereret)
....
DatagramPacket udp_packet = new DatagramPacket (message, count ,udp_address,
udp_port);
         //Send the data:
         udp_socket.send (udp_packet);

Her vil oversætteren ikke godkende 'udp_address' i DatagramPacket-linjen og
heller ikke udp_socket.send (begge får unresolved symbols).

Idéer bliver modtaget med kyshånd!

Links direkte til koden:
http://www.student.dtu.dk/~s960674/ComThread.java
http://www.student.dtu.dk/~s960674/ServerAppletThread.java
http://www.student.dtu.dk/~s960674/ClientApplet.java
http://www.student.dtu.dk/~s960674/clickme!.html
(Sidste to filer er klienten + webside)

Det er ComThread.java der fejler i oversættelsen.
--
Mvh, Kim Voss Schrader

OBS: Der kan max. attaches 30kb i e-mails til mig, ellers bouncer de.

Mikkel Bundgaard (14-04-2004)
Kommentar
Fra : Mikkel Bundgaard


Dato : 14-04-04 20:46

On Wed, 14 Apr 2004 21:21:58 +0200, Kim Voss Schrader wrote:

> public void run() {
> try {InetAddress udp_address = InetAddress.getByName (udp_ip);}
>        catch(UnknownHostException e) {}
> try {DatagramSocket udp_socket = new DatagramSocket ();}
>        catch(SocketException e) {}
> ...
> (her bliver count og message genereret) ...
> DatagramPacket udp_packet = new DatagramPacket (message, count
> ,udp_address, udp_port);
>          //Send the data:
>          udp_socket.send (udp_packet);
På grund af den måde som virkefelt (scope) virker i Java er udp_address
kun kendt indenfor blokken. Derfor må du ikke referere til den uden for
blokken (ligesom hvis du erklære en variabel inde i en while-løkke, så
kan du kun referere til den indenfor løkken).

En løsning kunne være (uden at jeg har kigget på koden) at flytte
erklæringerne af udp_address og udp_socket til toppen af run-metoden (og
huske at initialisere variablene) og kun bruge en tildeling i
try-blokkene.

public void run() {
InetAddress udp_address = null;
DatagramSocket udp_socket = null;
try {udp_address = InetAddress.getByName (udp_ip);}
       catch(UnknownHostException e) {}
try {udp_socket = new DatagramSocket ();}
       catch(SocketException e) {}
...

Ps. fjernsynet virker stadig, så tak for hjælpen
--
Mikkel Bundgaard
Ph.D. student at IT University of Copenhagen
http://www.itu.dk/people/mikkelbu/
Codito, Ergo Sum

Bertel Lund Hansen (14-04-2004)
Kommentar
Fra : Bertel Lund Hansen


Dato : 14-04-04 21:41

Mikkel Bundgaard skrev:

>En løsning kunne være (uden at jeg har kigget på koden) at flytte
>erklæringerne af udp_address og udp_socket til toppen af run-metoden (og
>huske at initialisere variablene) og kun bruge en tildeling i
>try-blokkene.

En anden og bedre består i at lave én try-blok til hele
proceduren. Hvis én af tingene fejler, er der ingen grund til at
fortsætte.

Og så er jeg enig med Rolf i at der skal laves noget meningsfuldt
i catch-blokkene.

Skitse:

public void run() {
try {
InetAddress udp_address = InetAddress.getByName (udp_ip);
DatagramSocket udp_socket = new DatagramSocket ();
...
DatagramPacket udp_packet =
new DatagramPacket (message, count ,udp_address,udp_port);
//Send the data:
udp_socket.send (udp_packet);
}
catch (UnknownHostException e) { }
catch (SocketException e) { }
}

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Kim Voss Schrader (14-04-2004)
Kommentar
Fra : Kim Voss Schrader


Dato : 14-04-04 22:21

Hej!

Bertel Lund Hansen wrote:
>
> En anden og bedre består i at lave én try-blok til hele
> proceduren. Hvis én af tingene fejler, er der ingen grund til at
> fortsætte.

Det er også hvad jeg netop har lavet, og det virker fino :) Havde bare lige
midlertidigt svedt ud, at Java har lokale variable i try's.

> Og så er jeg enig med Rolf i at der skal laves noget meningsfuldt
> i catch-blokkene.

Der skal nok ske noget, promise. Det er bare en simpel test og programmet er
slet ikke færdigt endnu.


Stort TAK til alle involverede! :)

--
Mvh, Kim Voss Schrader

OBS: Der kan max. attaches 30kb i e-mails til mig, ellers bouncer de.

Kristian Thy (14-04-2004)
Kommentar
Fra : Kristian Thy


Dato : 14-04-04 22:28

Kim Voss Schrader uttered:
> Der skal nok ske noget, promise.

public class ComThread implements Thread throws Exception {}

:)

\\kristian
--
78% of all statistics are made up on the spot.

Kim Voss Schrader (14-04-2004)
Kommentar
Fra : Kim Voss Schrader


Dato : 14-04-04 22:34

Hej!

Kristian Thy wrote:
>
> Kim Voss Schrader uttered:
> > Der skal nok ske noget, promise.
>
> public class ComThread implements Thread throws Exception {}
>
> :)

Måske en anelse mere - har ikke besluttet mig

--
Mvh, Kim Voss Schrader

OBS: Der kan max. attaches 30kb i e-mails til mig, ellers bouncer de.

Martin Moller Peders~ (15-04-2004)
Kommentar
Fra : Martin Moller Peders~


Dato : 15-04-04 08:28

In <407DAB49.526F8125@tdcadsl.dk> Kim Voss Schrader <teknik_kim@tdcadsl.dk> writes:

>Hej!

>Bertel Lund Hansen wrote:
>>
>> En anden og bedre består i at lave én try-blok til hele
>> proceduren. Hvis én af tingene fejler, er der ingen grund til at
>> fortsætte.

>Det er også hvad jeg netop har lavet, og det virker fino :) Havde bare lige
>midlertidigt svedt ud, at Java har lokale variable i try's.
>

Det har nu ikke noget med try at goere, men det faktum at der kommer en '{', som
altid skifter scope i Java.

/Martin

Bertel Lund Hansen (15-04-2004)
Kommentar
Fra : Bertel Lund Hansen


Dato : 15-04-04 08:43

Kim Voss Schrader skrev:

>Det er også hvad jeg netop har lavet, og det virker fino :) Havde bare lige
>midlertidigt svedt ud, at Java har lokale variable i try's.

Det er ikke try der gør det. Det er blokken {}. En variabel
oprettet inden i en blok, kan ikke bruges udenfor.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Kim Voss Schrader (15-04-2004)
Kommentar
Fra : Kim Voss Schrader


Dato : 15-04-04 08:51

Hej!

Bertel Lund Hansen wrote:
>
> Det er ikke try der gør det. Det er blokken {}. En variabel
> oprettet inden i en blok, kan ikke bruges udenfor.

Ok, det lyder jo egentligt også mere logisk.

--
Mvh, Kim Voss Schrader

OBS: Der kan max. attaches 30kb i e-mails til mig, ellers bouncer de.

Rolf Thorup (14-04-2004)
Kommentar
Fra : Rolf Thorup


Dato : 14-04-04 20:47

Kim Voss Schrader wrote:
> Hej!
>>Hmm, kunne du ikke poste et minimalt virkende (i dit tilfælde ikke
>>virkende) eksempel, med den kode du har problemer med. Jeg tror de
>>fleste som eller kunne hjælpe er tilbageholdende hvis de først skal til
>>at hente en zip-fil, udpakke og så først derefter tjekke koden.
>
>
> Hmm, kodeeksemplet er faktisk ret minimalt i forvejen, men ok:
>
> public class ComThread extends Thread {
> ...
> static final int udp_port = 8481;
> static final String udp_ip = "192.168.0.100";
> ...
> public void run() {
> try {InetAddress udp_address = InetAddress.getByName (udp_ip);}
>        catch(UnknownHostException e) {}
> try {DatagramSocket udp_socket = new DatagramSocket ();}
>        catch(SocketException e) {}
> ...
> (her bliver count og message genereret)
> ...
> DatagramPacket udp_packet = new DatagramPacket (message, count ,udp_address,
> udp_port);
>          //Send the data:
>          udp_socket.send (udp_packet);
>
> Her vil oversætteren ikke godkende 'udp_address' i DatagramPacket-linjen og
> heller ikke udp_socket.send (begge får unresolved symbols).

Med din oprindelig post i baghovedet kan jeg ikke lade være med at tænke
på hvad en forelæser jeg engang har haft sagde mht. at finde fejl. "If
you can't find the bug, it is probably because it is somewhere else".
Det lyder banalt, men det er jo ofte sandt. F.eks. fejlen er i testkoden
istedet for den testede kode etc.

Nu oversætter det ikke helt godt til dit problem, men dog til dine
oprindelige overvejelser:

"Der skulle vel ikke være noget til hindring for at kunne sende
UDP-pakker til et valgfrit IP-nummer fra serverprogrammet? Det er jo
ikke underlagt restriktionerne i en applet."

passer nu det meget godt.

Nå, men til sagen. Compileren har ret. Du har erklæret udp_address
udp_socket i en try-block og således ude af scope i forhold til hvor du
senere bruger dem.

Dine tomme catch-blokke gør også lidt ondt på mig. Er du sikker på at du
vil gøre ingenting hvis der bliver kastet en Exception?

Mvh Rolf

--
"Computers let you make more mistakes faster than any other invention
in human history, with the possible exception of handguns and tequila."
                --Mitch Radcliffe

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste