Demi-Duplex Chatter avec Logic SCP en Java

voix
0

J'ai actuellement un objet client et le serveur qui utilise un protocole pour formater les messages envoyés entre eux. Tout semble fonctionner très bien jusqu'à ce que le client et le serveur doivent se relaient pour communiquer entre eux. Le serveur envoie le message de bienvenue String welcomeMessage = args[2];au client, le client reçoit et peut répondre. Mon problème est quand je réponds dans la console client , il ne semble pas revenir au serveur et attendre la réponse du serveur, au lieu de cette réponse est imprimé à la console client (comme il se doit), mais un autre message CHAT est imprimé avant aller au serveur et attend sa réponse, ce qui ne va pas dans ma logique?

Ceci est le morceau principal de la logique du serveur

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);

            }
        }

où, en BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

logique client

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);
                }

Le protocole utilisé

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;
}

La sortie est bien, une fois que le serveur reconnaît qu'il envoie le CHAT SCP message de démarrage SCP CHAT (ce qui est juste une déclaration de débogage) SCP CHAT remoteAddress /127.0.0.1:3400 REMOTEPORT 3400

MessageContent bonjour SCP FIN Envoyer un message salut SCP CHAT remoteAddress localhost / 127.0.0.1: 3400 REMOTEPORT 3400

MessageContent FIN salut SCP

A ce stade, il DOIT revenir au serveur et attendez qu'il réponde à un message, mais cela arrive

Lancer SCP CHAT SCP CHAT remoteAddress /127.0.0.1:3400 REMOTEPORT 3400

MessageContent bob SCP FIN

où est-ce vient? Toute aide serait appréciée

Ci-joint la séquence de chat proposée

séquence chat

Créé 02/09/2018 à 05:18
source utilisateur
Dans d'autres langues...                            

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