Курсовой проектx

advertisement
Оглавление:
1.
Введение ...................................................................................................................................................... 2
2.
Математическая формулировка задачи ................................................................................................... 3
3.
Описание программы ................................................................................................................................. 4
3.1
Серверная часть. .................................................................................................................................. 4
3.2
Клиентская часть ................................................................................................................................. 5
4.
Руководство администратора (серверная часть). .................................................................................... 6
5.
Руководство пользователя (клиентская часть) ......................................................................................... 7
6.
Методика испытания .................................................................................................................................. 9
7.
Заключение ................................................................................................................................................10
8.
Литература .................................................................................................................................................11
9.
Приложение...............................................................................................................................................12
1
1. Введение
Системное программирование (или программирование систем) - это вид программирования,
который заключается в работе с системным программным обеспечением. Главным отличием
системного программирования по сравнению с прикладным программированием является то,
что прикладное программное обеспечение предназначено выпускать (создавать и обновлять)
программы для пользователей (например, текстовые процессоры), тогда как системное
программирование предназначено выпускать программы, обслуживающие аппаратное
обеспечение (например, дефрагментация диска ) что обусловливает значительную
зависимости такого типа ПО от аппаратной части.
Для разработки приложения выбрана среда разработки Eclipse Java EE IDE for Web
Developers.Version: Luna Service Release 1 (4.4.1) на основе Java версии build 1.8.0_25-b18.
2
2. Математическая формулировка задачи
Требуется разработать клиент-серверное приложение обмена сообщениями.
3
3. Описание программы
Приложение состоит из двух основных частей – серверная и клиентская часть.
3.1 Серверная часть.
Серверная часть служит для осуществления обмена данных между пользователями. Запуск
серверной части происходит путем вызова скрипта run.bat из директории distrib\server
дистрибутива. Серверная часть является центром системы и предназначена для обмена
сообщениями между пользователями.
Блок-схема архитектуры серверной части представлена на рисунке 3.1.1
Рис.3.1.1 Блок-схема архитектуры серверной части.
4
3.2 Клиентская часть
Клиентская часть служит для связи пользователя с серверной частью. Запуск серверной части
происходит путем вызова скрипта run.bat из директории distrib\client дистрибутива. Клиентская
часть является визуальной частью системы и предназначена для связи с серверной частью.
Блок-схема архитектуры клиентской части представлена на рисунке 4.1.1:
Рис.4.1.1 Блок-схема архитектуры клиентской части.
5
4. Руководство администратора (серверная часть).
Запуск серверной части происходит путем вызова скрипта run.bat из директории distrib\server
дистрибутива. При удачном запуске серверной части в консоли выводится соответствующее
сообщение (рис. 4.1):
Рис. 4.1 – Сообщение об успешном запуске серверной части приложения.
По умолчанию сервер запускается по адресу:
host: localhost ip
port:5678
При желании можно изменить порт сервера, для этого необходимо в аргументах
запуска задать номер порта.
6
5. Руководство пользователя (клиентская часть)
Запуск серверной части происходит путем вызова скрипта run.bat из директории distrib\client
дистрибутива. При удачном запуске серверной части в консоли выводится стартовое окно с
предложением ввести реквизиты сервера (рис. 5.1). В данном окне предлагается ввести хост, порт
сервера и уникальное имя пользователя. После ввода данных следует нажать кнопку «Connect» для
соединения с сервером.
Рис.5.1 - Окно соединения с сервером.
После установки соединения с сервером происходит переход на главную форму
клиентской части (Рис. 5.2):
Рис.5.2 – Главное окно клиентской части.
Данное окно позволяет следующие действия:
7
1. Отправку сообщения на сервер обмена сообщениями.
2. Выход пользователя с сервера обмена сообщениями.
При отправке сообщения все пользователи чата получают сообщение. Пример отображен
на рисунке 5.3:
Рис. 5.3 - Пример обмена сообщениями.
Также в чате фиксируется вход пользователя в чат и выход из чата. Пример отображен на
рисунке 5.4:
Рис. 5.4 – Пример фиксации события входа пользователя в чат и выхода из чата.
8
6. Методика испытания
Целью проведения испытания является проверка работоспособности и надежности
программы при различных условиях ее функционирования. Программа должна обеспечивать
корректность исходных данных, путем проверки и информирования пользователя о
возникших неточностях. Тестовые примеры выполнялись в среде операционной системы
Windows 7 x64, при использовании процессора Intel Core i5-2450M. Для работы с программой
также требуется наличие клавиатуры и манипулятора «мышь».
Для произведения испытания запустим серверную часть, осуществим подключение
произвольного количества пользователей и произведем произвольный обмен сообщениями.
Результат введения произвольных данных отображен на рисунке 6.1:
Рис. 6.1 – Результат произвольного обмена сообщениями
Проведенное тестирование программы не выявило сбойных ситуаций и
некорректностей в ее работе. Следует считать, что программа протестирована, отвечает
поставленным требованиям и вполне работоспособна.
9
7. Заключение
В ходе выполнения курсовой
1. Были закреплены знания по курсу «Операционные системы и системное
программирование».
2. Приобретен навык разработки объектно-ориентированных программ.
При разработке программе использовался модульный принцип построения с выделением
интерфейсов. Данный способ обеспечивает легкую расширяемость программы, возможность
переиспользования компонентов программы, совместную разработку программы несколькими
программистами, возможность заменять модули без доработки все программы в целом.
Данный подход является общепризнанным и обеспечивает эффективную разработку.
Приложение, созданное в процессе выполнения курсовой работы, является законченным
программным продуктом.
10
8. Литература
1.
Джонсон М. Харт - Системное программирование в среде Windows
2.
http://www.lessons-tva.info/edu/e-inf1/e-inf1-3-1.html
3.
http://life-prog.ru/view_zam2.php?id=226&cat=5&page=17
11
9. Приложение
Общая часть:
Содержит объекты для передачи данных, а также общие утилитарные классы.
Серверная часть:
package by.bntu.study.easychat.server;
import java.util.logging.Logger;
import by.bntu.study.easychat.server.entities.ServerThread;
public class Runner {
static Logger log = Logger.getGlobal();
public static void main(String[] args) {
log.info("EasyChat Server initialization start.");
int serverPort = 5678;
// init param
if(args!= null && args.length > 0){
String forceServerPort = args[0];
try{
serverPort = Integer.valueOf(forceServerPort);
}catch(Exception ex){
log.info("Uncorrect server port : " + forceServerPort+", use default.");
}
}
Thread serverThread = new Thread(new ServerThread(serverPort));
serverThread.start();
log.info("EasyChat Server initialization complete.");
}
}
package by.bntu.study.easychat.server.entities;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ServerThread implements Runnable {
private Logger log = Logger.getLogger(ServerThread.class.getName());
public ServerThread(int port){
this.port = port;
}
private int port;
public boolean stopFlag = true;
@Override
12
public void run() {
log.info("Try to start server on port : " + port);
try{
ServerSocket server = new ServerSocket(port);
ServerProcessor processor = new ServerProcessor();
while(true){
try{
log.info("Server wait requests.");
Socket serverSocket = server.accept();
log.info("Server catch request.");
PrintWriter out = null;
BufferedReader in = null;
try {
out = new PrintWriter(serverSocket.getOutputStream(), true);
in = new BufferedReader(new
InputStreamReader(serverSocket.getInputStream()));
} catch (Exception ex) {
ex.printStackTrace();
}
BufferedReader stdIn = new BufferedReader(new
InputStreamReader(serverSocket.getInputStream()));
String rawRequest = stdIn.readLine();
log.log(Level.INFO, "server request : " + rawRequest);
log.info("Server process rawRequest " + rawRequest);
String rawResponse = processor.call(rawRequest);
log.info("Server rawResponse " + rawResponse);
out.write(rawResponse);
out.flush();
if(!processor.getWorkFlag()){
break;
}
in.close();
out.close();
serverSocket.close();
}catch(Exception ex){
log.info("Processor exception : " + ex.getMessage());
}
}
server.close();
}catch(Exception ex){
log.info("Unable to start EasyChat server, reason : " +
ex.getLocalizedMessage());
}
log.info("Try to end server on port : " + port);
}
}
13
package by.bntu.study.easychat.server.entities;
import java.util.logging.Logger;
import by.bntu.study.easychat.api.entities.MessageDTO;
public class ServerProcessor {
private Logger log = Logger.getLogger(ServerThread.class.getName());
private Server server = new Server();
private MessageBroker broker = new MessageBroker();
private JSONConverter messageConverter = new JSONConverter();
public String call(String requestRaw){
String responseRaw = "empty";
log.info("requestRaw : " + requestRaw);
try{
MessageDTO request =
(MessageDTO)messageConverter.convertFrom(requestRaw, MessageDTO.class);
MessageDTO response = broker.process(server, request);
responseRaw = messageConverter.convertTo(response);
}catch(Exception ex){
ex.printStackTrace();
responseRaw = "server error";
}
log.info("responseRaw : " + responseRaw);
return responseRaw;
}
public boolean getWorkFlag(){
return server.isProcessFlag();
}
}
package by.bntu.study.easychat.server.entities;
import by.bntu.study.easychat.api.entities.MessageDTO;
import by.bntu.study.easychat.server.action.Action;
import by.bntu.study.easychat.server.action.AddUserAction;
import by.bntu.study.easychat.server.action.DeleteUserAction;
import by.bntu.study.easychat.server.action.ExitAction;
import by.bntu.study.easychat.server.action.GetMessageAction;
import by.bntu.study.easychat.server.action.SentMessageAction;
import by.bntu.study.easychat.server.action.UncknownAction;
public class MessageBroker {
public MessageDTO process(Server server, MessageDTO request){
String requestType = request.getType();
MessageDTO response;
Action action = null;
if("addUser".equals(requestType)){
action = new AddUserAction();
14
}
else if("deleteUser".equals(requestType)){
action = new DeleteUserAction();
}
else if("sentMessage".equals(requestType)){
action = new SentMessageAction();
}
else if("getMessage".equals(requestType)){
action = new GetMessageAction();
}
else if("exit".equals(requestType)){
action = new ExitAction();
}
else{
action = new UncknownAction();
}
response = action.process(server, request);
return response;
}
}
package by.bntu.study.easychat.server.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import by.bntu.study.easychat.api.entities.Message;
import by.bntu.study.easychat.api.entities.MessageDTO;
import by.bntu.study.easychat.api.entities.User;
import by.bntu.study.easychat.api.message.SentMessageDTO;
import by.bntu.study.easychat.server.entities.JSONConverter;
import by.bntu.study.easychat.server.entities.Server;
public class SentMessageAction implements Action{
private JSONConverter messageConverter = new JSONConverter();
private Logger log = Logger.getLogger(SentMessageAction.class.getName());
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public MessageDTO process(Server server, MessageDTO dto) {
15
try{
SentMessageDTO messageDTO =
(SentMessageDTO)messageConverter.convertFrom(dto.getBody(), SentMessageDTO.class);
dto.setValid(true);
if(messageDTO.getUser()!=null){
messageDTO.setValid(true);
String userName = messageDTO.getUser().getName();
String messageData = messageDTO.getMessage();
Message sentMessage = new Message();
sentMessage.setMessage(formatter.format(new Date())+ " | " +
userName + " : " + messageData);
sentMessage.setId(UUID.randomUUID().toString());
for(Entry<User, List<Message>> entry : server.getUsers().entrySet()){
entry.getValue().add(sentMessage);
}
}
dto.setBody(messageConverter.convertTo(messageDTO));
}catch(Exception ex){
log.log(Level.SEVERE, "Error!", ex);
dto.setValid(false);
dto.setBody(null);
}
return dto;
}
}
package by.bntu.study.easychat.server.action;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import by.bntu.study.easychat.api.entities.Message;
import by.bntu.study.easychat.api.entities.MessageDTO;
import by.bntu.study.easychat.api.entities.User;
import by.bntu.study.easychat.api.message.GetMessageDTO;
import by.bntu.study.easychat.server.entities.JSONConverter;
import by.bntu.study.easychat.server.entities.Server;
public class GetMessageAction implements Action{
private JSONConverter messageConverter = new JSONConverter();
private Logger log = Logger.getLogger(GetMessageAction.class.getName());
public MessageDTO process(Server server, MessageDTO dto) {
try{
GetMessageDTO messageDTO =
(GetMessageDTO)messageConverter.convertFrom(dto.getBody(), GetMessageDTO.class);
dto.setValid(true);
16
User targetUser = null;
if(messageDTO.getUser()!=null){
for(User user : server.getUsers().keySet()){
if(user.getId().equals(messageDTO.getUser().getId())){
targetUser = user;
messageDTO.setValid(true);
break;
}
}
messageDTO.setMessages(server.getUsers().get(targetUser));
server.getUsers().put(targetUser, new ArrayList<Message>());
}else{
messageDTO.setValid(false);
}
dto.setBody(messageConverter.convertTo(messageDTO));
}catch(Exception ex){
log.log(Level.SEVERE, "Error!", ex);
dto.setValid(false);
dto.setBody(null);
}
return dto;
}
}
package by.bntu.study.easychat.server.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import by.bntu.study.easychat.api.entities.Message;
import by.bntu.study.easychat.api.entities.MessageDTO;
import by.bntu.study.easychat.api.entities.User;
import by.bntu.study.easychat.api.message.ExitRequestDTO;
import by.bntu.study.easychat.server.entities.JSONConverter;
import by.bntu.study.easychat.server.entities.Server;
public class DeleteUserAction implements Action{
private JSONConverter messageConverter = new JSONConverter();
private Logger log = Logger.getLogger(DeleteUserAction.class.getName());
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public MessageDTO process(Server server, MessageDTO dto) {
try{
ExitRequestDTO deleteDTO =
(ExitRequestDTO)messageConverter.convertFrom(dto.getBody(), ExitRequestDTO.class);
17
dto.setValid(true);
if(deleteDTO.getUser()!=null){
String userName = deleteDTO.getUser().getName();
String userId = deleteDTO.getUser().getId();
for(User user : server.getUsers().keySet()){
if(user.getName().equalsIgnoreCase(userName) &&
user.getId().equals(userId)){
server.getUsers().keySet().remove(user);
deleteDTO.setValid(true);
break;
}
}
Message exitMessage = new Message();
exitMessage.setMessage(formatter.format(new Date())+ " | "
+userName + " exit from chat.");
exitMessage.setId(UUID.randomUUID().toString());
for(Entry<User, List<Message>> entry : server.getUsers().entrySet()){
entry.getValue().add(exitMessage);
}
}
dto.setBody(messageConverter.convertTo(deleteDTO));
}catch(Exception ex){
log.log(Level.SEVERE, "Error!", ex);
dto.setValid(false);
dto.setBody(null);
}
return dto;
}
}
package by.bntu.study.easychat.server.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.Map.Entry;
import java.util.logging.Logger;
import by.bntu.study.easychat.api.entities.Message;
import by.bntu.study.easychat.api.entities.MessageDTO;
import by.bntu.study.easychat.api.entities.User;
import by.bntu.study.easychat.api.message.LoginRequestDTO;
import by.bntu.study.easychat.server.entities.JSONConverter;
import by.bntu.study.easychat.server.entities.Server;
18
public class AddUserAction implements Action{
private JSONConverter messageConverter = new JSONConverter();
private Logger log = Logger.getLogger(AddUserAction.class.getName());
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public MessageDTO process(Server server, MessageDTO dto) {
try{
LoginRequestDTO loginDTO =
(LoginRequestDTO)messageConverter.convertFrom(dto.getBody(), LoginRequestDTO.class);
User newUser = loginDTO.getUser();
dto.setValid(true);
boolean userExist = false;
if(loginDTO.getUser()!=null && loginDTO.getUser().getName()!=null){
String userName = loginDTO.getUser().getName();
for(User user : server.getUsers().keySet()){
if(user.getName().equalsIgnoreCase(userName)){
userExist = true;
break;
}
}
}
if(userExist){
loginDTO.setValid(false);
loginDTO.setUser(null);
}else{
server.addUser(newUser);
loginDTO.setValid(true);
loginDTO.setUser(newUser);
Message enterMessage = new Message();
enterMessage.setMessage(formatter.format(new Date())+ " | "
+loginDTO.getUser().getName() + " entered into chat. ");
enterMessage.setId(UUID.randomUUID().toString());
for(Entry<User, List<Message>> entry : server.getUsers().entrySet()){
entry.getValue().add(enterMessage);
}
}
dto.setBody(messageConverter.convertTo(loginDTO));
}catch(Exception ex){
dto.setValid(false);
dto.setBody(null);
}
return dto;
}
}
19
Клиентская часть:
package by.bntu.study.easychat.client;
import java.util.logging.Logger;
import by.bntu.study.easychat.client.entities.ClientThread;
public class Runner {
static Logger log = Logger.getGlobal();
public static void main(String[] args) {
log.info("Hi, I'm EasyChat Client.");
Thread serverThread = new Thread(new ClientThread());
serverThread.run();
}
}
package by.bntu.study.easychat.client.form;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import by.bntu.study.easychat.api.entities.MessageDTO;
import by.bntu.study.easychat.api.entities.User;
import by.bntu.study.easychat.api.message.LoginRequestDTO;
import by.bntu.study.easychat.client.entities.ClientConnector;
import by.bntu.study.easychat.client.entities.ClientProcessor;
import by.bntu.study.easychat.client.entities.JSONConverter;
public class LoginView implements Viewable{
private ClientProcessor processor;
private JSONConverter messageConverter = new JSONConverter();
private JFrame frame = null;
public LoginView(ClientProcessor processor){
this.processor = processor;
}
public void view(Map<String, String> params) {
frame = new JFrame("EasyChat client");
frame.setSize(300, 180);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
20
JPanel panel = new JPanel();
frame.add(panel);
placeComponents(panel, frame);
frame.setResizable(false);
frame.setVisible(true);
}
private void placeComponents(JPanel panel,final JFrame frame) {
panel.setLayout(null);
JLabel hostLabel = new JLabel("Host");
hostLabel.setBounds(10, 10, 80, 25);
panel.add(hostLabel);
final JTextField hostText = new JTextField(20);
hostText.setBounds(100, 10, 160, 25);
hostText.setText("127.0.0.1");
panel.add(hostText);
JLabel portLabel = new JLabel("Port");
portLabel.setBounds(10, 40, 80, 25);
panel.add(portLabel);
final JTextField portText = new JTextField(20);
portText.setBounds(100, 40, 160, 25);
portText.setText("5678");
panel.add(portText);
JLabel userLabel = new JLabel("User");
userLabel.setBounds(10, 70, 80, 25);
panel.add(userLabel);
final JTextField userText = new JTextField(20);
userText.setBounds(100, 70, 160, 25);
panel.add(userText);
JButton registerButton = new JButton("Connect");
registerButton.setBounds(140, 105, 120, 25);
registerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ClientConnector connector = null;
String userName = null;
try{
String host = hostText.getText();
Integer port = Integer.valueOf(portText.getText());
21
if(host == null || host.trim().length() < 1 || port < 1){
throw new IllegalArgumentException("Uncorrect
connection information.");
}
userName = userText.getText();
if(userName!=null && userName.trim().length() < 1){
throw new IllegalArgumentException("UserName
cannot be empty.");
}
connector = new ClientConnector(host, port);
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(frame, "Please, check port
parameters.");
}catch(IllegalArgumentException iex){
JOptionPane.showMessageDialog(frame, iex.getMessage());
return;
}
try{
if(connector!=null && userName!=null){
LoginRequestDTO loginRequest = new
LoginRequestDTO();
User connectUser = new User();
connectUser.setName(userName);
loginRequest.setUser(connectUser);
MessageDTO result = connector.serverCall("addUser",
loginRequest);
if(result!=null && result.isValid()){
LoginRequestDTO loginResponse =
(LoginRequestDTO)messageConverter.convertFrom(result.getBody(), LoginRequestDTO.class);
if(loginResponse.isValid()){
processor.setClientConnector(connector);
processor.getClient().setUser(loginResponse.getUser());
processor.viewForm("chat", null, true);
}else{
JOptionPane.showMessageDialog(frame,
"Login is not valid. Please, select other.");
}
}else{
JOptionPane.showMessageDialog(frame,
"Interraction fault. Please, check connection informtaion.");
}
}
}catch(Exception ex){
JOptionPane.showMessageDialog(frame, "Unexpected error on
message creation : " + ex.getMessage());
22
return;
}
}
});
panel.add(registerButton);
}
public void destroy(Map<String, String> params) {
frame.dispose();
}
}
package by.bntu.study.easychat.client.form;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import java.util.logging.Logger;
import by.bntu.study.easychat.api.entities.Message;
import by.bntu.study.easychat.api.entities.MessageDTO;
import by.bntu.study.easychat.api.message.ExitRequestDTO;
import by.bntu.study.easychat.api.message.SentMessageDTO;
import by.bntu.study.easychat.client.entities.ClientProcessor;
import by.bntu.study.easychat.client.entities.JSONConverter;
public class ChatView implements Viewable{
private ClientProcessor processor;
private JFrame frame = null;
private JSONConverter messageConverter = new JSONConverter();
private DefaultTableModel model;
private JTable messageTable;
Logger log = Logger.getLogger(ChatView.class.getName());
23
public ChatView(ClientProcessor processor){
this.processor = processor;
}
public void addMessageIntoView(List<Message> messages){
if(messages!=null && messages.size() > 0){
for(Message message : messages){
model.addRow(new Object[]{message.getMessage()});
}
}
messageTable.changeSelection(messageTable.getRowCount() - 1, 0, false, false);
}
public void showMessage(String message){
JOptionPane.showMessageDialog(frame, message);
}
public void view(Map<String, String> params) {
frame = new JFrame("EasyChat client");
frame.setSize(500, 410);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.add(panel);
placeComponents(panel, frame);
frame.setResizable(false);
frame.setVisible(true);
}
private void placeComponents(JPanel panel,final JFrame frame) {
panel.setLayout(null);
model = new DefaultTableModel();
model.addColumn("EasyChat");
messageTable = new JTable(model);
messageTable.setFillsViewportHeight(true);
messageTable.setShowHorizontalLines(false);
messageTable.setRowSelectionAllowed(false);
JPanel chatPanel = new JPanel();
chatPanel.setLayout( new BorderLayout());
JScrollPane scrollPane = new JScrollPane(messageTable);
chatPanel.add(scrollPane, BorderLayout.CENTER);
chatPanel.setBounds(10, 10, 400, 320);
panel.add(chatPanel);
24
final JTextField messageText = new JTextField(20);
messageText.setBounds(10, 340, 400, 25);
panel.add(messageText);
JButton registerButton = new JButton("Sent");
registerButton.setBounds(420, 340, 60, 25);
registerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try{
String message = messageText.getText();
if(message!=null){
SentMessageDTO messageRequest = new
SentMessageDTO();
messageRequest.setUser(processor.getClient().getUser());
messageRequest.setMessage(message);
MessageDTO serverResponse =
processor.getClientConnector().serverCall("sentMessage", messageRequest);
if(serverResponse!=null && serverResponse.isValid()){
SentMessageDTO messageResponse =
(SentMessageDTO)messageConverter.convertFrom(serverResponse.getBody(),
SentMessageDTO.class);
if(messageResponse.isValid()){
messageText.setText(null);
processor.processAction("getMessage",
null);
}else{
JOptionPane.showMessageDialog(frame,
"Message is not valid. Please, check message.");
}
}else{
JOptionPane.showMessageDialog(frame,
"Interraction fault. Please, check connection informtaion.");
}
}
}catch(Exception ex){
JOptionPane.showMessageDialog(frame, "Unexpected error on
message creation : " + ex.getMessage());
return;
}
}
});
panel.add(registerButton);
JButton exitButton = new JButton("Exit");
exitButton.setBounds(420, 10, 60, 25);
exitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
25
try{
ExitRequestDTO exitRequest = new ExitRequestDTO();
exitRequest.setUser(processor.getClient().getUser());
MessageDTO serverResponse =
processor.getClientConnector().serverCall("deleteUser", exitRequest);
if(serverResponse!=null && serverResponse.isValid()){
ExitRequestDTO loginResponse =
(ExitRequestDTO)messageConverter.convertFrom(serverResponse.getBody(),
ExitRequestDTO.class);
if(loginResponse.isValid()){
processor.processAction("exit", null);
}else{
JOptionPane.showMessageDialog(frame, "Exit is
not valid. Please, select other operation.");
}
}else{
JOptionPane.showMessageDialog(frame, "Interraction
fault. Please, check connection informtaion.");
}
}catch(Exception ex){
JOptionPane.showMessageDialog(frame, "Unexpected error on
message creation : " + ex.getMessage());
return;
}
}
});
panel.add(exitButton);
runAutoUpdateMessages();
}
private void runAutoUpdateMessages(){
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
processor.processAction("getMessage", null);
}
}, 1, 3, TimeUnit.SECONDS);
}
public void destroy(Map<String, String> params) {
frame.dispose();
}
}
package by.bntu.study.easychat.client.entities;
26
import java.util.Map;
import java.util.logging.Logger;
import by.bntu.study.easychat.client.action.Action;
import by.bntu.study.easychat.client.action.ExitAction;
import by.bntu.study.easychat.client.action.GetMessageAction;
import by.bntu.study.easychat.client.action.LoginAction;
import by.bntu.study.easychat.client.action.SentMessageAction;
import by.bntu.study.easychat.client.form.ChatView;
import by.bntu.study.easychat.client.form.LoginView;
import by.bntu.study.easychat.client.form.Viewable;
public class ClientProcessor {
public ClientProcessor(){
client = new Client();
log = Logger.getLogger(ClientProcessor.class.getName());
}
private Logger log;
private ClientConnector clientConnector;
private Client client;
private Viewable rootView;
public void start(){
processAction("login", null);
}
public void processAction(String actionName, Map<String, String> params){
Action action;
if("login".equals(actionName)){
action = new LoginAction(this);
}else if("exit".equals(actionName)){
action = new ExitAction(this);
}else if("sentMessage".equals(actionName)){
action = new SentMessageAction(this);
}else if("getMessage".equals(actionName)){
action = new GetMessageAction(this);
}else{
action = null;
}
action.process(params);
}
public void viewForm(String formName, Map<String, String> params, boolean isRoot){
Viewable tempView = null;
if("login".equals(formName)){
tempView = new LoginView(this);
}else if("chat".equals(formName)){
tempView = new ChatView(this);
}else{
27
tempView = null;
}
if(isRoot){
if(rootView!=null){
rootView.destroy(params);
}
rootView = tempView;
}
tempView.view(params);
}
public ClientConnector getClientConnector() {
return clientConnector;
}
public void setClientConnector(ClientConnector clientConnector) {
this.clientConnector = clientConnector;
}
public Client getClient() {
return client;
}
public void setClient(Client client) {
this.client = client;
}
public Viewable getRootView() {
return rootView;
}
public void setRootView(Viewable rootView) {
this.rootView = rootView;
}
}
package by.bntu.study.easychat.client.entities;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import by.bntu.study.easychat.api.entities.MessageDTO;
28
public class ClientConnector {
public ClientConnector(String host, int port) {
this.port = port;
this.host = host;
}
private int port;
private String host;
private Logger log = Logger.getLogger(ClientConnector.class.getName());
private JSONConverter messageConverter = new JSONConverter();
public MessageDTO serverCall(String requestType, Object requestBody){
MessageDTO response = null;
try {
MessageDTO request = new MessageDTO();
request.setType(requestType);
request.setTimestamp(new Date().getTime());
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
socket = new Socket(host, port);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (Exception ex) {
ex.printStackTrace();
}
String rawMessageBody = "";
if(requestBody!=null){
rawMessageBody = messageConverter.convertTo(requestBody);
request.setBody(rawMessageBody);
}
String rawRequest = messageConverter.convertTo(request);
log.log(Level.INFO, "try to sent request : " + rawRequest);
out.println(rawRequest);
out.flush();
BufferedReader stdIn = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
String rawResponse = stdIn.readLine();
log.log(Level.INFO, "server response : " + rawResponse);
response = (MessageDTO)messageConverter.convertFrom(rawResponse, MessageDTO.class);
out.close();
in.close();
socket.close();
29
} catch (Exception ex) {
ex.printStackTrace();
}
return response;
}
}
package by.bntu.study.easychat.client.action;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import by.bntu.study.easychat.api.entities.MessageDTO;
import by.bntu.study.easychat.api.message.GetMessageDTO;
import by.bntu.study.easychat.client.entities.ClientProcessor;
import by.bntu.study.easychat.client.entities.JSONConverter;
import by.bntu.study.easychat.client.form.ChatView;
public class GetMessageAction implements Action{
private ClientProcessor processor;
private Logger log = Logger.getLogger(GetMessageAction.class.getName());
private JSONConverter messageConverter = new JSONConverter();
public GetMessageAction(ClientProcessor processor){
this.processor = processor;
}
public void process(Map<String, String> params) {
try{
GetMessageDTO getMessageRequest = new GetMessageDTO();
getMessageRequest.setUser(processor.getClient().getUser());
ChatView view = (ChatView)processor.getRootView();
MessageDTO serverResponse =
processor.getClientConnector().serverCall("getMessage", getMessageRequest);
if(serverResponse!=null && serverResponse.isValid()){
GetMessageDTO messageResponse =
(GetMessageDTO)messageConverter.convertFrom(serverResponse.getBody(),
GetMessageDTO.class);
if(messageResponse.isValid()){
view.addMessageIntoView(messageResponse.getMessages());
}else{
view.showMessage("Messages is not valid.");
}
}else{
view.showMessage("Interraction fault. Please, check connection
informtaion.");
}
}catch(Exception ex){
30
log.log(Level.SEVERE, "Unexpected error on getting message.",
ex.getMessage());
return;
}
}
}
package by.bntu.study.easychat.client.action;
import java.util.Map;
import by.bntu.study.easychat.client.entities.ClientProcessor;
public class SentMessageAction implements Action{
ClientProcessor processor;
public SentMessageAction(ClientProcessor processor){
this.processor = processor;
}
@Override
public void process(Map<String, String> params) {
// TODO Auto-generated method stub
}
}
package by.bntu.study.easychat.client.action;
import java.util.Map;
import by.bntu.study.easychat.client.entities.ClientProcessor;
public class LoginAction implements Action{
private ClientProcessor processor;
public LoginAction(ClientProcessor processor){
this.processor = processor;
}
public void process(Map<String, String> params) {
processor.viewForm("login", null, true);
}
}
package by.bntu.study.easychat.client.action;
import java.util.Map;
import by.bntu.study.easychat.client.entities.ClientProcessor;
31
public class ExitAction implements Action{
private ClientProcessor processor;
public ExitAction(ClientProcessor processor){
this.processor = processor;
}
public void process(Map<String, String> params) {
processor.setClient(null);
processor.setClientConnector(null);
processor.viewForm("login", null, true);
}
}
32
Related documents
Download