Aquí podría ser tu PUBLICIDAD


Half-duplex de Chat lógica en la SCP en Java

votos
0

Actualmente tengo un objeto cliente y el servidor que utiliza un protocolo para dar formato a los mensajes enviados entre ellos. Todo parece funcionar bien hasta que el cliente y el servidor deben esperar su turno para comunicarse entre sí. El servidor envía el mensaje de bienvenida String welcomeMessage = args[2];al cliente, el cliente recibe y puede responder. Mi problema es cuando contesto en la consola del cliente no parece ir de nuevo al servidor y esperar la respuesta de los servidores, en lugar de esta respuesta se imprime en la consola del cliente (como debería), pero otro mensaje de chat se imprime antes ir al servidor ya la espera de su respuesta, lo que está mal con mi lógica?

Esta es la principal parte de la lógica del servidor

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

            }
        }

donde en BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

lógica del cliente

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

El protocolo utilizado

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 salida está muy bien, una vez que el servidor reconoce que envía el mensaje de inicio CHAT SCP SCP CHAT (esto es sólo una declaración de depuración) SCP CHAT RemoteAddress /127.0.0.1:3400 RemotePort 3400

MESSAGECONTENT hola SCP FIN Enviar un mensaje localhost hi SCP CHAT RemoteAddress / 127.0.0.1: 3400 3400 RemotePort

MESSAGECONTENT alta FIN SCP

En este punto se debe ir de nuevo al servidor y esperar a que responda con un mensaje, sino que esto ocurre

Comience SCP SCP RemoteAddress CHAT CHAT /127.0.0.1:3400 RemotePort 3400

FIN MESSAGECONTENT Bob SCP

¿De dónde viene esto? Cualquier ayuda sería apreciada

Se adjunta la secuencia de chat propuesta

Secuencia de chat

Publicado el 02/09/2018 a las 05:18
fuente por usuario Riggy
En otros idiomas...        العربية       


Aquí podría ser tu PUBLICIDAD