Сообщение обмена сокетом Java между клиентом и сервером - PullRequest
1 голос
/ 25 февраля 2012

У меня проблемы с многопоточностью сокета Java, когда я сам узнаю о сокете на странице Java Oracle, после прочтения примера о сокете TCP и UDP.

Я пытаюсь использовать эти знания, чтобы написать что-то для обмена сообщениямимежду клиентом и сервером.

Но мне интересно, когда клиент отправляет сообщение на сервер с многопоточностью, и у сервера есть какое-то условие.

Пример: Когда клиент отправляет на сервер письмо A

Сервер получит и имеет условие типа

if(inputfromClient.equals("A")){
     // how to make input fromClient is null after get message (inputstream) from client?
}

В приведенном выше комментарии к фрагменту кода вы можете увидеть мой вопрос, потому что после того, как клиент отправит ввод, который является A, клиент отправит следующее письмо, как Bв такой структуре:

if(inputfromClient.equals("A")){
    if(inputfromClient.equals("B")){
       //some condition
    }
}

мой код сервера выглядит так:

 public class TCPServerThread extends Thread{

    Socket client = null;
    BufferedReader in;
    String statusBuffer = new String();
    String intputLine, outputLine;
    public TCPServerThread(Socket socket){
        client = socket;
    }

    public void run(){
        try {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(TCPServerThread.class.getName()).log(Level.SEVERE, null, ex);
            }
            PrintWriter out = new PrintWriter(client.getOutputStream(),true);
            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            gameHandle g = new gameHandle();
            boolean condition = true;

                while((intputLine=in.readLine()) != null){
                    outputLine = g.processInput(intputLine);
                    out.println(outputLine);
                    System.out.println(outputLine);

                }



                  out.close();
                  in.close();
                  client.close();


        } catch (IOException ex) {
            Logger.getLogger(TCPServerThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


}

и код моего клиента:

  public class ClientTCP {

    public static void main(String[] args) {
        try {
            Socket socket;
            PrintWriter out = null;
            BufferedReader in = null;
            try {
                socket = new Socket("localhost", 4444);
                out = new PrintWriter(socket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            } catch (UnknownHostException ex) {
                Logger.getLogger(ClientTCP.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(ClientTCP.class.getName()).log(Level.SEVERE, null, ex);
            }

            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            String fromServer;
            String fromUser;
            fromUser = stdIn.readLine();
            while(fromUser!= null){

                out.println(fromUser);
                //System.out.println(in.readLine());
            }
        } catch (IOException ex) {
            Logger.getLogger(ClientTCP.class.getName()).log(Level.SEVERE, null, ex);
        }
   }


}

Большое спасибо.

Отредактировано

Хорошо, чтобы иметь смысл, как я упоминал ранее

Клиент отправляет сообщения на сервер

Клиент: onePMode

клиент: интернет

....

и сервер получает сообщения от клиента и сравнивает их

if(inputLine.equals("onePMode")){
 // it will continue to compare inputline is satisfy with sub condition
  if(inputLine.equals("internet"){
   //do something
   }

}

Отредактировано

GameHandle для обработки ввода

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package srpserver;

import java.net.Socket;
import java.util.Random;

/**
 *
 * @author ***
 */
public class gameHandle {

    private String modePlay = "";
    private String wait = "wait";
    private String status = wait;
    private String keyword = "";
    private Socket client;
    private String letter = "";
    private String onePMode ="onePMode";
    private String getWord = "getWord";
    private String twoPMode = "twoPMode";
    private String waitForPlayer = "waitforPlayer";
    private String ready = "ready";
    private String question = "question";

    public gameHandle(){}

    public gameHandle(Socket socket,String Mode, String keyword, String letter){
        client = socket;
        this.keyword = keyword;
        this.letter = letter;
        modePlay = Mode;
    }
    //array with word will be rando,
    String[] words = {"laptop", "network", "device", "game", "mobile",
    "word", "november", "december", "signal", "internet","localhost","boot", "socket",
    "client", "server", " port", "exception", "java", "dotnet","singleton", "ejb","hibernate",
    "computer", "microsoft", "lan"};

    //this method get random word from array    
    public String getWord(){
        Random r = new Random();
        String randomString = words[r.nextInt(words.length)];
        return randomString;
    }



    public String processInput(String inputString){
        String outPut = "";
            if(status.equals("wait")){
                if(inputString.equals(onePMode)){
                    status = question;
                    outPut = "hello";
                   // outPut = question;
                }
            }else if(status.equals(question)){
                if(inputString.equals(getWord)){
                    /*keyword = getWord();
                    outPut = getWord();
                    System.out.println(keyword);
                    status = question;*/
                    outPut = "getworrdddrdd";
                    System.out.println("get worddddddddd");

                }else if(keyword.contains(inputString)){
                    System.out.println("containt");
                }
            }
        return outPut;
    }





    public static void main(String[] args) {
        gameHandle a = new gameHandle();
        System.out.println(a.getWord());

    }
}

Ответы [ 2 ]

0 голосов
/ 18 декабря 2015

Я думаю, что вы хотите, чтобы принять решение на основе предыдущего состояния.Тогда все, что вам нужно, это объектно-ориентированный конечный автомат.Если клиент входит в 'A' из исходного состояния, то сервер должен ожидать 'B' или 'C' в качестве следующего ввода.Если клиент вводит 'B', пока сервер находится в состоянии 'A', то сервер должен ожидать «D» или «E» в качестве следующего ввода.Если это то, что вам нужно, вы должны использовать Шаблон проектирования состояний .

  • Каждое ваше состояние должно быть представлено объектом.

  • Сначала вам нужно создать Interface для состояния и извлечь из него ваши состояния.

  • Затем вы должны создать класс-оболочку для инкапсуляции ваших состояний.Этот класс-обертка служит конечным автоматом.Он должен поддерживать ссылку на «текущий» объект State.

Когда клиент вводит символ, он будет передан экземпляру оболочки.Затем оболочка передаст его объекту текущего состояния.Затем текущий объект State обработает эти данные и определит следующее состояние машины.Он создаст следующее состояние (объект) и обновит «текущую» ссылку на состояние класса-оболочки.Затем следующий клиентский ввод будет обработан вновь созданным объектом State.

Вот пример

Состояние интерфейса

public interface State {

    void perform(GameHandler context, String data);
}

Класс оболочки

public class GameHandler {

    State current_state; // holds the current state of the state machine

    // Initial state should be passed to the constructor 
    public GameHandler(State current_state) { 
        this.current_state = current_state;
    }

    // Sets the next state of the state machine
    // Called by State objects
    public void setNextState(State mystate) {
        this.current_state = mystate;
    }

    // Outside world will communicate with state machine using this method 
    public void processRequest(String data){
        current_state.perform(this,data);
    } 
}

Реализация состояний

public class State_A implements State {

    @Override
    public void perform(GameHandler context, String data) {
        /* Process input data.
         * Based on your processing, decide the next state
         * Then set that sate (assuming it as State_B)
         */
        context.setNextState(new State_B());
    }
}

public class State_B implements State {

    @Override
    public void perform(GameHandler context, String data) {
        /* process input data.
         * based on your processing, decide the next state
         * then set that sate (assuming it as State_C)
         */
        context.setNextState(new State_C());

    }
}

Как использовать это на вашем сервере

...

// Assuming State_A as the initial state
GameHandler g = new GameHandler(new State_A());
boolean condition = true;

      while((intputLine=in.readLine()) != null)
      {
         g.processRequest(intputLine);
      }

...

0 голосов
/ 25 февраля 2012

Возможно, это самое простое решение вашей проблемы.

public class TCPServerThread extends Thread{

    Socket client = null;
    BufferedReader in;

    String statusBuffer = new String();

    public TCPServerThread(Socket socket){
        client = socket;
    }

    public void run() {
    try {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        PrintWriter out = new PrintWriter(client.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(
                client.getInputStream()));
        String intputLine, outputLine;

        intputLine = in.readLine();

        while (intputLine != null) {
            if(intputLine.equals("close")){
                break;
            }
            processResponse(intputLine);
            intputLine = in.readLine();             
        }

        out.close();
        in.close();
        client.close();

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public void processResponse(String response) {

    // reset the statusBuffer so that we can process new commands from
    // client
    if (response.equals("reset")) {
        statusBuffer = new String();
        System.out.println("reset");
    } else {
        statusBuffer = statusBuffer + "#" + response;
    }

    if (statusBuffer.equals("#onePMode")) {
        System.out.println("#onePMode");
    } else if (statusBuffer.equals("#onePMode#internet")) {
        System.out.println("#onePMode#internet");
    } else if (statusBuffer.equals("#onePMode#play")) {
        System.out.println("#onePMode#play");
    }

}

}

Я также обнаружил одну ошибку в коде вашего клиента.Исправленный код выглядит следующим образом:

public class ClientTCP {

    public static void main(String[] args) {
        try {
            Socket socket = null;
            PrintWriter out = null;
            BufferedReader in = null;
            try {
                socket = new Socket("localhost", 1000);
                out = new PrintWriter(socket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            } catch (Exception ex) {
                ex.printStackTrace();
            }

            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

            String fromServer;

            String fromUser  = stdIn.readLine();
            while(fromUser!= null){
                out.println(fromUser);

                if(fromUser.equals("close")){
                    break;
                }

                fromUser = stdIn.readLine();

            }
            out.close();
            in.close();
            socket.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
   }

} 

Я выполнил программу на своем конце, и она успешно запустилась.Теперь у вас не должно быть никаких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...