Дизайн (классы, методы, интерфейсы) приложений реального времени (сервер / клиент) - PullRequest
2 голосов
/ 11 августа 2011

Я искал хорошую книгу или статью на эту тему, но не нашел много.Я не нашел хороший пример - кусок кода - для конкретного сценария.Как клиент / сервер разговор.В протоколе моего приложения они должны отправлять / получать сообщения.Например: сервер хочет отправить файл клиенту. Клиент может принять или нет, если он согласится, сервер отправит байты через одно и то же соединение / сокет.Все остальное мое приложение использует методы блокировки, у сервера есть метод

Вот что я сделал:

Метод сервера:

public synchronized void sendFile(File file)
{
  //send messsage asking if I can send a file
  //block on read, waiting for client responde
  //if client answers yes, start sending the bytes
  //else return
}

Методы клиента:

public void reciveCommand()
{
   //read/listen for a command from socket
   //if is a send file command handleSendFileCommand();
   //after the return of handleSendFileCommand() listen for another command
}

public void handleSendFileCommand()
{
   //get the file server want to send
   //check if it already has the file
   //if it already has, then send a command to the socket saying it already has and return         
   //else send a command saying server can send the file
   //create a FileInputStream, recive bytes and then return method
}

Я на 100% уверен, что это неправильно, потому что сервер и клиенты не могли бы говорить двунаправленно, я имею в виду, что когда сервер хочет отправить команду серверу, он должен следовать порядку команд до тех пор, покаРазговор закончен, только тогда они могут отправить / получить другую последовательность команд.Вот почему я сделал все методы, отправляющие запросы, синхронизированными

Мне не потребовалось много времени, чтобы понять, что мне нужно изучить шаблоны проектирования для такого типа приложений ... Я читал о шаблоне проектирования Chain of Responsibility, ноЯ не понимаю, как я могу использовать это или другой хороший шаблон дизайна в этой ситуации.

Я надеюсь, что кто-то может помочь мне с некоторым примером кода.Заранее спасибо

1 Ответ

1 голос
/ 11 августа 2011
Ключевое слово

synchronized в Java означает нечто совершенно иное - оно помечает метод или блок кода как критическую секцию , которую может выполнить только один поток за один раз. Вам здесь не нужно.

Затем TCP-соединение является двунаправленным на уровне байтового потока. Синхронизация между сервером и клиентом определяется обменом сообщениями. Представьте себе клиента (то же самое относится и к серверу) как state machine. Некоторые типы сообщений являются приемлемыми в текущем состоянии, некоторые нет, некоторые переключают узел в другое состояние.

Поскольку вы рассматриваете шаблоны проектирования, State pattern очень применимо здесь.

...