Avatar billede stof Nybegynder
27. februar 2010 - 13:30 Der er 5 kommentarer og
1 løsning

SocketConnection fejler - sender den foregående besked i stedet for at sende den nuværende

Hej derude. Jeg har opsat 2 socketconnections. Den ene til at modtage data (socket, incoming, port) - den anden til at sende data (socket2, outGoing, 8283)
Men når jeg sender noget til socket(1) vil det først skrives på socket2 når jeg igen sender noget til socket(1)

Håber I forstår og kan hjælpe mig. På forhånd tusind tak

KODEN:
try
        {
            //MODTAGE DATA
        socket = new ServerSocket(port);
        incoming = socket.accept();
        //SENDE DATA
        socket2 = new ServerSocket(8283);
        outGoing = socket2.accept();
        outGoingStream = new PrintStream(outGoing.getOutputStream());
   
        //
            readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
           
        //Modtager
        printOut = new PrintStream(incoming.getOutputStream());
            printOut.println("Enter EXIT to exit.\r");
            out("Enter EXIT to exit.\r");
            outGoingStream.println("inden metoden");
            outGoingStream.flush();
                   
            boolean done = false;
     
           
        while (!done)
            {
             
              str = readerIn.readLine();
           
            outGoingStream.flush();
            outGoingStream.println(str);
           
        if (str == null)
                {
                    done = true;
                }
                else
                {
                    out("else");
                    out(str + "\r");
                    if(str.trim().equals("EXIT"))
                    {
                        done = true;
                    }
                }
                //incoming.close();
        //outGoing.close();
            }
        //out("while slut");

       
       


        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }

    private void out(String str)
    {
        //printOut.println(str);
        System.out.println(str);
    }
}
Avatar billede arne_v Ekspert
27. februar 2010 - 22:12 #1
Vildt gæt:

            outGoingStream.flush();
            outGoingStream.println(str);

skal være:

            outGoingStream.println(str);
            outGoingStream.flush();
Avatar billede arne_v Ekspert
27. februar 2010 - 22:13 #2
og så skal de nok flyttes ned i else blokken
Avatar billede stof Nybegynder
01. marts 2010 - 15:38 #3
er prøvet. virker heller ikke.

har du andre gæt?
det er virkelig frustrerende.
Avatar billede stof Nybegynder
01. marts 2010 - 16:03 #4
while (!done)
            {
              str = readerIn.readLine();
              //str2 = readerIn.readLine();
               
           
            if (str == null)
                {
                    done = true;
                }
                else
                {
                   
                    outGoingStream.println(str);
                    outGoingStream.println(str);
                    outGoingStream.flush();
                               
                    out(str + "\r");
                    if(str.trim().equals("EXIT"))
                    {
                        done = true;
                    }
                }
               
            }


Når min while-løkke ser sådan ud printer den det rigtige efter første tryk. Det er dog dobbelt, så den modtager det gamle + det nuværende.
Eks.
Til socket(1) sendes "Test"
- Der sendes ikke noget fra socket2

Til socket (1) sendes "Test1"
- socket2 sender "Test" + "Test1" i samme hug.

Et hack, som gør at jeg da modtager det rigtige, men også modtager noget gammelt. Kunne være fedt hvis det kan undgås.
Avatar billede welcor Nybegynder
09. marts 2010 - 18:24 #5
Jeg har taget din kode, og lagt den ind i en main() metode:
package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Tester {

    /**
    * @param args
    */
    public static void main(String[] args) {
        try {
            // MODTAGE DATA
            ServerSocket socket = new ServerSocket(8282);
            Socket incoming = socket.accept();
            // SENDE DATA
            ServerSocket socket2 = new ServerSocket(8283);
            Socket outGoing = socket2.accept();
            PrintStream outGoingStream = new PrintStream(outGoing
                .getOutputStream());

            //
            BufferedReader readerIn = new BufferedReader(new InputStreamReader(
                incoming.getInputStream()));

            // Modtager
            PrintStream printOut = new PrintStream(incoming.getOutputStream());
            printOut.println("Enter EXIT to exit.\r");
            out("Enter EXIT to exit.\r");
            outGoingStream.println("inden metoden");
            outGoingStream.flush();

            boolean done = false;

            String str = "";
            while (!done) {

                str = readerIn.readLine();

                outGoingStream.flush();
                outGoingStream.println(str);

                if (str == null) {
                    done = true;
                } else {
                    out("else");
                    out(str + "\r");
                    if (str.trim().equals("EXIT")) {
                        done = true;
                    }
                }
            }

        } catch (Exception e) {
            System.out.println(e);
        }
    }

    private static void out(String str) {
        // printOut.println(str);
        System.out.println(str);
    }
}

Og her virker det som det skal: Først kobler jeg til port 8282 og så port 8283 i et andet vindue. Det jeg skriver på port 8282 kommer til 8283, så snart jeg trykker enter.
Avatar billede stof Nybegynder
07. februar 2011 - 19:52 #6
Jeg måtte løse det ved at dobbelt-sende det hver gang- ikke pænt, men andet virkede ikke.
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