Avatar billede dsj Nybegynder
18. oktober 2002 - 14:45 Der er 4 kommentarer og
1 løsning

DatagramSocket: Socket closed

Hejsa!

Jeg har lavet mig en server-applikation og en client-application, begge i
Java. Kommunikationen foregår med UDP-pakker. Jeg har testet med 3
test-opstillinger:
1. Server og client på samme maskine (w2k) - virker perfekt
2. Server kørende på min LAN-server (Mandrake 8.2) og clienten kørende på
min kontormaskine (w2k) - virker perfekt
3. Server kørende på en Internet-server (Redhat 7.3) og clienten kørende på
min kontormaskine (w2k) -VIRKER IKKE

Ved sidste opstilling får jeg følgende fejl: "java.net.SocketException:
socket closed"

Det foregår sådan, at clienten sender en connect-request til serveren og
skal herefter modtage en bekræftelse. Koden er:

DatagramSocket socket = new DatagramSocket();
socket.setSoTimeout(5000);
DatagramPacket packet = new DatagramPacket(b, b.length,
InetAddress.getByName(serverAdress), clientPort);
byte[] receive = new byte[1536];
DatagramPacket rPacket = new DatagramPacket(receive, receive.length);
socket.send(packet);
socket.receive(rPacket); // Her bliver SocketException smidt

Pakken bliver sendt, men modtages ikke på serveren og lige idet
socket.receive(rPacket) kaldes, smides en SocketException. Den timer ikke
engang ud, men smider en SocketException med det samme.

Hvad sker der, og hvordan kan jeg løse problemet ????

Der er i øvrigt én her som har samme problem: http://forum.java.sun.com/thread.jsp?forum=11&thread=173276
Avatar billede dsj Nybegynder
18. oktober 2002 - 14:48 #1
Nåh, det hjalp at slå linux' indbyggede firewall fra, men du kan stadig tjene pointene ved at svare mig på, hvorfor den ikke smider en SocketTimeoutException, men en SocketException, når nu ikke den modtager noget??
Avatar billede disky Nybegynder
18. oktober 2002 - 14:58 #2
Det var egentligt et godt spørgsmål, specielt fordi den metode slet ikke skulle kunne smide den exception du får.

lav lige et
try
{
//din kode
}
catch(Exception e) //brug normalt aldrig Exception.
{
  e.printStackTrace(System.out);
}
Avatar billede dsj Nybegynder
18. oktober 2002 - 15:25 #3
java.net.SocketException: socket closed
    at java.net.PlainDatagramSocketImpl.receive(Native Method)
    at java.net.DatagramSocket.receive(DatagramSocket.java:392)
    at tester.Listener.connect(Listener.java:132)
    at tester.Listener.start(Listener.java:43)
    at tester.Listener.access$0(Listener.java:9)
    at tester.Listener$1.run(Listener.java:29)
    at java.lang.Thread.run(Thread.java:484)

socket.receive(rPacket); // linie 132

Jeg har på fornemmelsen at det har noget at gøre med w2k's underliggende winsock2 og at det er DatagramSocket, som faktisk smider en SocketException:
"Thrown to indicate that there is an error in the underlying protocol, such as a TCP error."
Avatar billede disky Nybegynder
18. oktober 2002 - 15:38 #4
det kan der være noget om.

Jeg ville spørge på forummet på www.javasoft.com der sidder de rigtigt hardcore folk (sun's egne)
Avatar billede dsj Nybegynder
31. oktober 2002 - 14:17 #5
Lukker...

Problemet skyldes en fejl i w2k's implementering af winsock2, derfor en SocketException. Applikationen skal så bare kodes til at kunne klare den exception på linie med en timeout-exception
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