Avatar billede superanden Nybegynder
12. februar 2009 - 11:27 Der er 7 kommentarer og
2 løsninger

TCP/IP Socket virker ikke efter hensigten

Hej jeg har forsøgt at skrive en TCP/IP socket som min robot skal kommunikere med. Og så vidt jeg kan se så bliver der etableret en forbindelse første gang jeg har åbnet min socket, men hvis jeg så stopper robotten og køre programmet igen så kan den ikke rigtig få ordenlig forbindelse.

Samtidigt er funktionaliteten af programmet heller ikke som jeg havde forventet. Idéen er at robotten på et tidspunkt sender "get data" til min PC og når den gør det skal jeg inden for 2sek svarer "data 100". Måden jeg har forsøgt mig på er.

import java.lang.*;
import java.io.*;
import java.net.*;

class Server {
    public static void main(String args[]) {
    try{
        String data = "data 100";
        ServerSocket srvr = new ServerSocket(12345);
        Socket skt = srvr.accept();
        PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
        while(1==1){   
            if (in.readLine().equals("get data")){
                out.print(data);
            }
        }
    }
        catch(Exception e) {
        System.out.println("Error");
    }
    }
}

Gør jeg det rigtigt.?
Avatar billede netkoen Nybegynder
12. februar 2009 - 12:11 #1
http://www.exampledepot.com/egs/javax.net.ssl/Client.html

God hjemmeside til at finde eksempler man kan arbejde videre på.
Avatar billede netkoen Nybegynder
12. februar 2009 - 12:19 #2
Pokkers. Det var egentligt et dårligt eksempel jeg gav dig der.. Gik lige lidt hurtigt.. Men at du kan finde et fungere eksempel på siden.

Så vidt jeg kan se, så skal du jo have din accept til at gøre igen. Når du starter clienten igen skal den jo skabe forbindelse en gang til.
Avatar billede superanden Nybegynder
12. februar 2009 - 12:36 #3
Det er da en meget god pointe mht accept står uden for løkken ;-) Det vil jeg da teste om et par timer og lige melde tilbage.
Avatar billede arne_v Ekspert
12. februar 2009 - 15:14 #4
En ydre while loekke som accepter connections er nok en god ting.

Og du kan saa overveje om den while loekke skal starte en traad, saa nye requests kan serviceres inden den forreige er faerdig.

Og den indre while loekke skal nok afslutte paent naar connection lukkes (readLine returnerer null i det tilfaelde).
Avatar billede superanden Nybegynder
12. februar 2009 - 19:21 #5
Så fik jeg leget lidt med det. Fik ændret accept connections til en ydre whille løkke. Hvilket løste problemet med at skulle genstarte serveren.

Samtidigt fik jeg løst buggen i programmet ved at overvåge trafikken med Wireshark. Det viste sig at kommandoen

out.print(data);

Sendte flere data strenge i en pakke, hvilket gjorde at robotten ikke forstod beskeden. Dette blev løst ved at ændre kommandoen til

out.println(data), (hvilket er det samme som at smide en out.flush(); efter out.print(data).

Tak for hjælpen til jer begge 2 i må gerne smide et svar så i kan få jeres point.
Avatar billede arne_v Ekspert
12. februar 2009 - 19:28 #6
.
Avatar billede netkoen Nybegynder
12. februar 2009 - 20:28 #7
Bare glad for at kunne hjælpe. Har selv lige arbejde med TCP i en studieopgave. Gik dog rigtig hurtig videre og benytte RMI i stedet for.

Det burde du overveje, det er rigig sjovt at sidde og lege med og løser en del problemer med eventuelt har med kun at sende TCP pakker.
Avatar billede arne_v Ekspert
12. februar 2009 - 20:40 #8
Hvis robotten kan snakke RMI, saa ville det nok vaere nemmere.
Avatar billede superanden Nybegynder
15. februar 2009 - 16:57 #9
Som standard understøtter robotten ikke RMI, og nu har jeg også fået løst problemerne og fået det til at virke, med tak til jer.

Men jeg vil da også lige læse op på RMI således at jeg har kendskaberne til næste gang jeg skal lave et ligende projekt.

Igen. Tak for hjælpen.
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