Java, проблема с отправкой сообщения через сокет - PullRequest
2 голосов
/ 16 мая 2011

У меня проблема с моей программой на Java.Он имеет сокетное соединение между сервером и множеством клиентов.Вот сервер (часть, которая касается проблемы):

private static ArrayList<ParallelServer> clientConnected = new ArrayList<ParallelServer>();


public Server(int port) {
    this.port = port;
    if (!startServer())
        JOptionPane.showMessageDialog(new JFrame(""),
                "Error!", "ERROR!",
                JOptionPane.ERROR_MESSAGE);
}

private boolean startServer() {
    try {
        server = new ServerSocket(port);
        loadDatabase();
    } catch (IOException ex) {
        ex.printStackTrace();
        return false;
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return true;
}

public void runServer() {
    while (true) {
        try {
            client = server.accept();
            ParallelServer pServer = new ParallelServer(client);
            clientConnected.add(pServer);
            Thread thread = new Thread(pServer);
            thread.start();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}


public static void sendBroadcast(String username) throws IOException {
    for(int i = 0; i < clientConnected.size(); i++)
        clientConnected.get(i).sendAnswer("@change," + username);
}

Параллельный сервер:

    private Socket client;
    private InputStreamReader inputstreamreader;
    private BufferedReader bufferedreader;
    private PrintWriter printwriter;

    public ParallelServer(Socket client) {
        this.client = client;
    }

    public void run() {
        try {
            inputstreamreader = new InputStreamReader(client.getInputStream());
            bufferedreader = new BufferedReader(inputstreamreader);
            printwriter = new PrintWriter(client.getOutputStream(), true);
            String lineread = "";

            while (client.isConnected()) {
                lineread = bufferedreader.readLine();
                doCommand(lineread);
            }
        } catch (UnknownHostException unhe) {
        } catch (InterruptedIOException intioe) {
        } catch (IOException ioe) {
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public void sendAnswer(String answer) throws IOException {
        printwriter = new PrintWriter(client.getOutputStream(), true);
        printwriter.println(answer);
        printwriter.flush();
    }

А вот клиент:

private String serverurl = "localhost";
private int serverport = 7777;
private PrintWriter printwriter;
private InputStreamReader inputstreamreader;
private BufferedReader bufferedreader;
private Socket server;

public Client() {
    server = null;
    try {
        server = new Socket(serverurl, serverport);
        server.setSoTimeout(5000);
    } catch (UnknownHostException unhe) {
        System.out.println("UnknownHostException: " + unhe.getMessage());
    } catch (InterruptedIOException intioe) {
        System.out.println("Timeout while attempting to establish socket connection.");
    } catch (IOException ioe) {
        JOptionPane.showMessageDialog(new JFrame(),"Unable to reach the server!","ERROE!",JOptionPane.ERROR_MESSAGE);
    }
}

public String sendCommand(String command) throws IOException {
    if(server == null) {
        try {
            server = new Socket(serverurl, serverport);
            server.setSoTimeout(5000);
        } catch (UnknownHostException unhe) {
            System.out.println("UnknownHostException: " + unhe.getMessage());
        } catch (InterruptedIOException intioe) {
            System.out.println("Timeout while attempting to establish socket connection.");
        } catch (IOException ioe) {
            JOptionPane.showMessageDialog(new JFrame(),"Unable to reach the server!","ERROR!",JOptionPane.ERROR_MESSAGE);
        }
    }
    if(server != null) {
        printwriter = new PrintWriter(server.getOutputStream(), true);
        printwriter.println(command);
        printwriter.flush();
        inputstreamreader = new InputStreamReader(server.getInputStream());
        bufferedreader = new BufferedReader(inputstreamreader);

        return bufferedreader.readLine();
    }
    else
        return "@serverProblem";
}

Программа представляет собой простую онлайн-игру с поворотами.Очереди игроков создаются с помощью очереди, и когда игрок проходит свой ход, сервер отправляет широковещательное сообщение, в котором говорится: «Теперь очередь за Игроком 1».(например).Моя проблема в том, что когда клиент получает сообщение, он как бы добавляет ответ: «Теперь очередь за игроком 1».к следующему сообщению, которое он получит.В моем случае: когда игрок проходит свой ход, он отправляет «@ passTurn, username».Класс ParallelServer опрашивает его из очереди, помещает его в конец очереди, отправляет клиенту «@ok», чтобы сообщить, что очередь успешно изменилась, и сообщает классу сервера отправить широковещательное сообщение.Затем, когда тот же клиент попытается выполнить дальнейшее действие, он рассмотрит «Теперь ход игрока 1».в качестве ответа сервер дал ему.Вместо этого я хотел бы, чтобы сервер и клиенты работали как всегда, и когда широковещательное сообщение будет обработано, клиент будет уведомлен без какого-либо побочного эффекта.Что я могу сделать?Благодаря.

1 Ответ

1 голос
/ 16 мая 2011

Ваш механизм двунаправленной передачи сообщений должен выглядеть примерно так:

Сервер:

Wait on any client InputStream
if (broadcast) 
  broadcast_message()
else 
  process_message()

Клиент:

Receiving Thread:
Wait on server broadcast

Sending Thread:
Wait on messages to be sent to server from the User Input

Это должно помочь:)

Надеюсь, это поможет.Ура!

...