Avatar billede tripwire Nybegynder
02. juli 2003 - 12:44 Der er 9 kommentarer og
1 løsning

problem med strenge over sockets

Jeg er ved at lave en server/klint løsning som skal kunne sende/modtage textstrenge. Jeg har følgende kode, men det virker ikke:

server:
fromClient = new BufferedReader(new InputStreamReader(soc.getInputStream()));
toClient = new PrintWriter(soc.getOutputStream(),true);

public void run(){
        String message = null;
        System.out.println("in RUN");
        while(true){
            try{
                System.out.println("fromClient="+fromClient);
                message = fromClient.readLine();
                System.out.println("after message");
                if(message == null || fromClient == null){
                    return;
                }
                System.out.println("recieved from player: " + message);
            }
            catch(Exception e){
                System.out.println("Fejl i player run: " + e.getMessage());
                e.printStackTrace();
                break;
            }
        }
    }

klient:
void send(String text){
        toServer.println(text);
        toServer.flush();
}


jeg får følgende fejl

in RUN
fromClient=java.io.BufferedReader@95fd19
Fejl i player run: socket closed
java.net.SocketException: socket closed
        at java.net.SocketInputStream.socketRead0(Native Method)


nogen ide om hvordan jeg løser dette?
Avatar billede arne_v Ekspert
02. juli 2003 - 12:56 #1
Jeg kan kun se 2 muligheder:

1)  serverens main thread har lukket soc inden denne thread
    når at kalde readLine

2)  client har nået at lukek forbindelsen inden readLine
Avatar billede arne_v Ekspert
02. juli 2003 - 12:57 #2
NB: medmindre du har gode grunde til at køre en text protokol, så
    var ObjectInputStream og ObjectOutputStream måske nemmere at
    bruge. Fordi så skal du ikke til at parse input og formatere
    output.
Avatar billede tripwire Nybegynder
02. juli 2003 - 13:11 #3
jeg bruger både objektinputstream og bufferedreader på samme socket kan det have noget at sige? (tror det ikke)
forstår ikke punkt 1) - hvorfor skulle mainthread gøre det?

og 2) klientan kalder aldrig close().
Jeg skal overføre data hvergang klienten har trykket på en tast er det så ikke 'overkill' at bruge objektinputstream?
Avatar billede philox Nybegynder
02. juli 2003 - 13:33 #4
Man skal holde tungen lige i munden, hvis man dekorerer den samme inputstrem flere gange.
Avatar billede arne_v Ekspert
02. juli 2003 - 13:39 #5
Jeg tror ikke at BufferedReader og ObjectInputSTream kan sameksistere
på samem input socket.

BufferedReader har jo som navnet siger en buffer. D.v.s. at den fysisk
læser mere data end den umiddelbart skal bruge ind. Og de data er så ikke
tilgængelige for ObjectInputStream.
Avatar billede arne_v Ekspert
02. juli 2003 - 13:41 #6
re 1)

Muligt. Jeg kender jo ikke dit hoved-program. Hvis det closer socket, så
er socket selvfølgelig også closed for threaden.

re 2)

Og det terminerer heller ikke ? Det vil jo lave en implicit luk !
Avatar billede tripwire Nybegynder
02. juli 2003 - 14:03 #7
Skal jeg så åbne to sockets?
Avatar billede arne_v Ekspert
02. juli 2003 - 14:09 #8
Jeg ville bare sende den String med writeObject og læse den med
readObject og glemme alt om BufferedReader og readLine.
Avatar billede tripwire Nybegynder
02. juli 2003 - 14:14 #9
giver det bedre performance??
objektinput vs. bufferedreader???
Avatar billede arne_v Ekspert
02. juli 2003 - 14:24 #10
Jeg tror at performance er ca. den samme - man sender lidt flete bytes
over nettet, men undgår parsning/formatering i både client og
server.

Men du slipper for problemer med 2 forskellige typer IO til samme socket.
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