Half-Duplex via Chat Logic com SCP em Java

votos
0

Atualmente tenho um objeto cliente e servidor que utiliza um protocolo para formatar as mensagens enviadas entre eles. Tudo parece funcionar bem até que o cliente e servidor deve se revezam para se comunicar uns com os outros. O servidor envia a mensagem de boas-vindas String welcomeMessage = args[2];para o cliente, em seguida, o cliente recebe-lo e pode responder. Meu problema é quando eu respondo no console do cliente não parece voltar para o servidor e aguardar a resposta servidores, em vez esta resposta é impressa no console do cliente (como deveria), mas outra mensagem de chat é impresso antes ir ao servidor e à espera de sua resposta, o que está errado com a minha lógica?

Esta é a principal fatia da lógica do 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);

            }
        }

onde em BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

lógica 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);
                }

O protocolo usado

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

A saída é bom, uma vez que o servidor reconhece ele envia o SCP mensagem de chat Iniciar SCP CHAT (isto é apenas uma declaração de depuração) SCP CHAT RemoteAddress /127.0.0.1:3400 RemotePort 3400

MessageContent Olá SCP END Enviar localhost mensagem oi SCP CHAT RemoteAddress / 127.0.0.1: 3400 RemotePort 3400

MessageContent END SCP oi

Neste ponto, deve voltar para o servidor e esperar por ele para responder com uma mensagem, mas em vez isso acontece

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

MessageContent bob SCP END

onde é que isto vem? Qualquer ajuda seria apreciada

Anexada representa a sequência de chat proposto

Sequência de bate-papo

Publicado 02/09/2018 em 05:18
fonte usuário
Em outras línguas...                            

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