Полудуплекс чат Logic с SCP в Java

голоса
0

Я в настоящее время есть клиент и сервер объекта , который использует протокол для форматирования сообщений , передаваемых между ними. Все это , кажется, работает хорошо , пока клиент и сервер не должен сменяться , чтобы общаться друг с другом. Сервер отправляет приветственное сообщение String welcomeMessage = args[2];клиента, то клиент получает его и может ответить. Мой вопрос , когда я отвечаю на консоли клиента это не похоже , чтобы вернуться на сервер и ждать ответа сервера, вместо того, чтобы этот ответ распечатывается на консоль клиента (как это должно быть), но другое сообщение ЧАТ печатается перед собирается на сервер и ждет своего ответа, что не так с моей логикой?

Это основной кусок логики сервера

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

            }
        }

в которой BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

логика клиента

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

Протокол, используемый

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

Выход хорошо, как только сервер признает он посылает SCP ЧАТ сообщение Start SCP ЧАТ (это просто доводка заявление) SCP ЧАТ REMOTEADDRESS /127.0.0.1:3400 RemotePort 3400

MESSAGECONTENT привет SCP END Отправить сообщение привет SCP ЧАТ REMOTEADDRESS локальный / 127.0.0.1: 3400 RemotePort 3400

MESSAGECONTENT привет SCP END

На данный момент он должен вернуться на сервер и ждать его, чтобы ответить на сообщение, но вместо того, чтобы это произошло

Начало SCP ЧАТ SCP ЧАТ REMOTEADDRESS /127.0.0.1:3400 RemotePort 3400

MESSAGECONTENT боб SCP END

где это приходит? Любая помощь будет оценена

К нему прилагается предлагаемая последовательность чат

Чат Sequence

Задан 02/09/2018 в 05:18
источник пользователем
На других языках...                            

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