Half-Duplex Chat Logic med SCP i Java

stemmer
0

Jeg har for tiden en klient og server gjenstand som benytter en protokoll for å formatere de meldinger som sendes mellom dem. Det hele ser ut til å fungere fint til klienten og serveren må bytter på å kommunisere med hverandre. Serveren sender velkomstmeldingen String welcomeMessage = args[2];til kunden, da kunden får det og kan svare. Problemet mitt er når jeg svarer på klienten konsollen det ser ikke ut til å gå tilbake til serveren og vente på servere svar, i stedet dette svaret skrives til klienten konsollen (som det skal), men en annen CHAT meldingen skrives ut før kommer til serveren og venter på sitt svar, hva er galt med min logikk?

Dette er den viktigste del av Server logikk

while ((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
            String userLine[];
            userLine = inputLine.trim().split( );
            if((userLine[0]).equals(USERNAME))
            {
                outputLine = protocol.processInput(userLine[1], time);
                out.println(outputLine);
            }else if(inputLine.equals(SCP ACKNOWLEDGE)) {
                outputLine = protocol.processInput(welcomeMessage, time);
                out.println(outputLine);
            }else if(inputLine.equals(SCP CHAT)) {
                System.out.println(Send a message);
                String chatMessage = stdIn.readLine();
                if (chatMessage != null) {
                    outputLine = protocol.processInput(chatMessage, time);
                    out.println(outputLine);
                    System.out.println(Waiting for a message);
                }
            }else if(inputLine.equals(SCP DISCONNECT)) {
                outputLine = protocol.processInput(inputLine, time);
                out.println(outputLine);

            }
        }

hvor i BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

klient logikk

boolean disconnect = false;
        boolean connected = false;
        //while (running)
      //  {
            if(!connected) {
                fromUser = SCP CONNECT\nSERVERADDRESS  + hostName +
                        \nSERVERPORT  + portNumber + \nREQUESTCREATED  +
                        time + \nUSERNAME  + username + \nSCP END;
                connected = true;
                System.out.println(fromUser);
                out.println(fromUser);
            }
           // }else {
                while ((fromServer = in.readLine()) != null) {
                    System.out.println(Sever +fromServer);
                    if (fromServer.equals(SCP ACCEPT)) {
                        System.out.println(fromServer);
                        while ((fromServer = in.readLine()) != null) {
                            System.out.println(fromServer);
                            if (fromServer.equals(SCP END)) {
                                break;
                            }
                        }
                        fromUser = SCP ACKNOWLEDGE\nUSERNAME  + username +
                                \nSERVERADDRESS  + hostName + \nSERVERPORT  + portNumber +
                                \nSCP END;
                    } else if (fromServer.equals(SCP CHAT)) {
                        System.out.println(fromServer);
                        while ((fromServer = in.readLine()) != null) {
                            System.out.println(fromServer);
                            if(fromServer.equals(SCP END)){
                                break;
                            }
                        }
                        System.out.println(Send a message);
                       // if((fromServer = in.readLine()) != null){
                            String chatMessage = stdIn.readLine();
                            if (chatMessage != null) {
                                if(!chatMessage.equals(DISCONNECT)) {
                                    fromUser = SCP CHAT\nREMOTEADDRESS  + kkSocket.getRemoteSocketAddress() +
                                            \nREMOTEPORT  + kkSocket.getPort() + \n\nMESSAGECONTENT  +
                                            chatMessage + \nSCP END;
                                    //System.out.println(fromUser);
                                    //out.println(fromUser);
                                }else {
                                    fromUser = SCP DISCONNECT\nSCP END;
                                    disconnect = true;
                                    //System.out.println(fromUser);
                                    //out.println(fromUser);
                                }
                            }
                       // }
                    } else if(fromServer.equals(SCP ACKNOWLEDGE) && disconnect){
                        out.close();
                        in.close();
                        kkSocket.close();
                    }

                    System.out.println(fromUser);
                    out.println(fromUser);
                }

Protokollen brukte

public Protocol(Socket clientSocket)
{
    this.clientSocket = clientSocket;
}

public String processInput(String theInput, long time) throws ParseException
{
    String theOutput = null;
    if (state == WAITING) {
        theOutput = Connection request received;
        state = CONNECT;
    }
    if (state == CONNECT) {
        if (reject(time) > 5000) {
            theOutput = SCP REJECT \nTIMEDIFFERENTIAL  + reject(time) +
                    \nREMOTEADDRESS  + clientSocket.getRemoteSocketAddress() + \nSCP END;
            state = REJECT;
        } else {
            theOutput = SCP ACCEPT\nUSERNAME  + theInput +
                    \nCLIENTADDRESS  + clientSocket.getLocalSocketAddress() + \nCLIENTPORT  +
                    clientSocket.getLocalPort() + \nSCP END;
            state = ACCEPT;
        }
    } else if (state == REJECT) {
        theOutput = ;
        state = 0;
    } else if (state == ACCEPT) {
        theOutput = SCP CHAT\nREMOTEADDRESS  + clientSocket.getLocalSocketAddress() +
                \nREMOTEPORT  + clientSocket.getLocalPort() + \n\nMESSAGECONTENT  + theInput +
                \nSCP END;
        state = CHAT;
    } else if(state == CHAT) {
        theOutput = SCP CHAT\nREMOTEADDRESS  + clientSocket.getLocalSocketAddress() +
                \nREMOTEPORT  + clientSocket.getLocalPort() + \n\nMESSAGECONTENT  + theInput +
                \nSCP END;
    } else if(theInput.equals(SCP DISCONNECT)) {
        theOutput = SCP ACKNOWLEDGE\nSCP END;
    }
    return theOutput;
}

public String processInput(long time) throws ParseException
{
    String theOutput = null;
    if (state == WAITING) {
        theOutput = Connection request received;
        state = CONNECT;
    }
    if (state == CONNECT) {
        if (reject(time) > 5000) {
            theOutput = SCP REJECT \nTIMEDIFFERENTIAL  + reject(time) +
                    \nREMOTEADDRESS  + clientSocket.getLocalSocketAddress() + \nSCP END;
            state = REJECT;
        }
    } else if (state == REJECT) {
        theOutput = ;
        state = 0;
    } else if (state == ACCEPT) {

    }
    return theOutput;
}

Utgangen er fint, når serveren erkjenner den sender SCP CHAT melding start SCP CHAT (dette er bare en debugging setning) SCP CHAT REMOTEADDRESS /127.0.0.1:3400 REMOTEPORT 3400

MESSAGECONTENT hallo SCP END Send en melding hi SCP CHAT REMOTEADDRESS localhost / 127.0.0.1: 3400 REMOTEPORT 3400

MESSAGECONTENT hi SCP END

På dette punktet bør det gå tilbake til serveren og vent til det å svare med en melding, men i stedet dette skjer

Begynn SCP CHAT SCP CHAT REMOTEADDRESS /127.0.0.1:3400 REMOTEPORT 3400

MESSAGECONTENT bob SCP END

hvor dette kommer fra? Eventuelle hjelpe ville være verdsatt

Vedlagt er den foreslåtte chat-sekvensen

Chat Sequence

Publisert på 02/09/2018 klokken 05:18
kilden bruker
På andre språk...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more