diff --git a/.gitignore b/.gitignore
index bdd4439..e4316fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
*.pdf
/out/
/Homeworks/
+*.zip
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..b08e5aa
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/sqlite_jdbc_3_21_0.xml b/.idea/libraries/sqlite_jdbc_3_21_0.xml
new file mode 100644
index 0000000..7ab8ea7
--- /dev/null
+++ b/.idea/libraries/sqlite_jdbc_3_21_0.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Java2.iml b/Java2.iml
index c90834f..050079b 100644
--- a/Java2.iml
+++ b/Java2.iml
@@ -7,5 +7,6 @@
+
\ No newline at end of file
diff --git a/JavaFX_chat.db b/JavaFX_chat.db
new file mode 100644
index 0000000..4c5da40
Binary files /dev/null and b/JavaFX_chat.db differ
diff --git a/src/ru/geekbrains/java2/lesson_02/Homework.java b/src/ru/geekbrains/java2/lesson_02/Homework.java
new file mode 100644
index 0000000..6785c4e
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_02/Homework.java
@@ -0,0 +1,62 @@
+// https://github.com/Stormcoder74/Java2.git
+package ru.geekbrains.java2.lesson_02;
+
+public class Homework {
+ public static final int SIZE = 4;
+
+ public static void main(String[] args) {
+ try {
+ int testResult = testException(new String[][]{
+ {"6", "2", "12", "5"},
+ {"3", "9", "4", "21"},
+ {"4", "s", "7", "8"},
+ {"1", "0", "3", "9"}});
+ System.out.println("testResult = " + testResult);
+ } catch (MyArraySizeException | MyArrayDataException e) {
+ System.err.println(e.getMessage());
+ //e.printStackTrace();
+ }
+
+ try {
+ int testResult = testException(new String[][]{
+ {"6", "2", "12", "5"},
+ {"3", "9", "4"},
+ {"4", "5", "7", "8"},
+ {"1", "0"}});
+ System.out.println("testResult = " + testResult);
+ } catch (MyArraySizeException | MyArrayDataException e) {
+ System.err.println(e.getMessage());
+ //e.printStackTrace();
+ }
+
+ try {
+ int testResult = testException(new String[][]{
+ {"6", "2", "12", "5"},
+ {"3", "9", "4", "21"},
+ {"4", "5", "7", "8"},
+ {"1", "0", "3", "9"}});
+ System.out.println("testResult = " + testResult);
+ } catch (MyArraySizeException | MyArrayDataException e) {
+ System.err.println(e.getMessage());
+ //e.printStackTrace();
+ }
+ }
+
+ public static int testException(String[][] arr) throws MyArraySizeException {
+ int result = 0;
+ if (arr.length != SIZE) throw new MyArraySizeException(SIZE, SIZE);
+ else for (int i = 0; i < SIZE; i++) {
+ if (arr[i].length != SIZE) throw new MyArraySizeException(SIZE, SIZE);
+ for (int j = 0; j < SIZE; j++) {
+ try {
+ result += Integer.parseInt(arr[i][j]);
+ } catch (NumberFormatException e) {
+ throw new MyArrayDataException(i, j);
+ }
+ }
+ }
+ return result;
+ }
+
+
+}
diff --git a/src/ru/geekbrains/java2/lesson_02/Main.java b/src/ru/geekbrains/java2/lesson_02/Main.java
deleted file mode 100644
index 5e672bd..0000000
--- a/src/ru/geekbrains/java2/lesson_02/Main.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package ru.geekbrains.java2.lesson_02;
-
-public class Main {
-}
diff --git a/src/ru/geekbrains/java2/lesson_02/MainClass.java b/src/ru/geekbrains/java2/lesson_02/MainClass.java
new file mode 100644
index 0000000..ffd0008
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_02/MainClass.java
@@ -0,0 +1,30 @@
+package ru.geekbrains.java2.lesson_02;
+
+import javafx.scene.media.SubtitleTrack;
+
+public class MainClass {
+ public static void main(String[] args) {
+ a();
+ }
+
+ static void a() {
+ b();
+ }
+
+ static void b() {
+ c();
+ }
+
+ static void c() {
+ System.out.println("START");
+ try {
+ int x = 10 / 0;
+ } catch (ArithmeticException e) {
+ System.out.println("AE");
+ return;
+ } finally {
+ System.out.println("FINALLY");
+ }
+ System.out.println("END");
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_02/MyArrayDataException.java b/src/ru/geekbrains/java2/lesson_02/MyArrayDataException.java
new file mode 100644
index 0000000..c19577a
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_02/MyArrayDataException.java
@@ -0,0 +1,7 @@
+package ru.geekbrains.java2.lesson_02;
+
+public class MyArrayDataException extends NumberFormatException {
+ public MyArrayDataException(int size1, int size2) {
+ super("Невозможно преобразовать в число строку в ячейке [" + size1 + "][" + size2 + "].");
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_02/MyArraySizeException.java b/src/ru/geekbrains/java2/lesson_02/MyArraySizeException.java
new file mode 100644
index 0000000..915fa42
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_02/MyArraySizeException.java
@@ -0,0 +1,7 @@
+package ru.geekbrains.java2.lesson_02;
+
+public class MyArraySizeException extends Exception {
+ MyArraySizeException(int size1, int size2) {
+ super("Размерность массива отличается от [" + size1 + "][" + size2 + "].");
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkArrList.java b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkArrList.java
new file mode 100644
index 0000000..a50261a
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkArrList.java
@@ -0,0 +1,66 @@
+package ru.geekbrains.java2.lesson_03.Classwork;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ClassWorkArrList {
+ public static void main(String[] args) {
+ List list = new ArrayList<>(Arrays.asList("A", "@", "Core", "Java", "Home"));
+
+ list.add("Hello");
+ list.remove("@");
+ list.remove(2);
+
+ System.out.println(list);
+
+ list.set(2, "Фффигасе");
+
+ System.out.println(list.get(2));
+ System.out.println();
+
+ ArrayList intList = new ArrayList<>();
+ intList.add(4);
+ intList.add(3);
+ intList.add(2);
+ intList.add(1);
+ intList.add(0);
+ System.out.println(intList);
+
+ intList.add(3, 10);
+ System.out.println(intList);
+
+ intList.remove(4);
+ System.out.println(intList);
+
+ intList.remove((Integer) 4);
+ System.out.println(intList);
+ System.out.println();
+
+ ArrayList strList = new ArrayList<>();
+ strList.add("A");
+ strList.add("C");
+ strList.add("A");
+ strList.add("A");
+ strList.add("B");
+ strList.add("D");
+ do {
+ System.out.println(strList);
+ }while (strList.remove("A"));
+
+// strList.clear();
+// System.out.println(strList);
+
+
+ ArrayList strList2 = new ArrayList<>();
+ strList2.add("N");
+ strList2.add("K");
+ strList2.add("S");
+
+ strList.addAll(strList2);
+ strList.add(1, "S");
+ System.out.println(strList);
+ strList.removeAll(strList2);
+ System.out.println(strList);
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkBox.java b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkBox.java
new file mode 100644
index 0000000..4cc9c85
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkBox.java
@@ -0,0 +1,34 @@
+package ru.geekbrains.java2.lesson_03.Classwork;
+
+import java.util.Arrays;
+import java.util.TreeSet;
+
+public class ClassWorkBox implements Comparable {
+ private int size;
+
+ public ClassWorkBox(int size) {
+ this.size = size;
+ }
+
+ @Override
+ public String toString() {
+ return "Box{" +
+ "size=" + size +
+ '}';
+ }
+
+ @Override
+ public int compareTo(Object o) {
+ return ((Integer)this.size).compareTo(((ClassWorkBox)o).size);
+ }
+
+ public static void main(String[] args) {
+ TreeSet tSet = new TreeSet<>(Arrays.asList(
+ new ClassWorkBox(4),
+ new ClassWorkBox(2),
+ new ClassWorkBox(8),
+ new ClassWorkBox(1)
+ ));
+ System.out.println(tSet);
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkIterator.java b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkIterator.java
new file mode 100644
index 0000000..df6ebd7
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkIterator.java
@@ -0,0 +1,40 @@
+package ru.geekbrains.java2.lesson_03.Classwork;
+
+import java.util.*;
+
+public class ClassWorkIterator {
+ public static void main(String[] args) {
+ // ошибочная реализация
+ ArrayList list = new ArrayList<>(Arrays.asList(2, 2, 2, 2, 1, 0, 4, 6, 2, 2, 6));
+ for (int i = 0; i < list.size(); i++) {
+ if (list.get(i) == 2) list.remove(i);
+ }
+ System.out.println(list);
+
+ // верная реализация
+ ArrayList list2 = new ArrayList<>(Arrays.asList(2, 2, 2, 2, 1, 0, 4, 6, 2, 2, 6));
+ Iterator iter = list2.iterator();
+ while (iter.hasNext()){
+ if(iter.next() == 2) {
+ iter.remove();
+ }
+ }
+ System.out.println(list2);
+
+ // реализация на HashMap
+ HashMap hm = new HashMap<>();
+ hm.put("a", 1);
+ hm.put("b", 5);
+ hm.put("c", 3);
+ hm.put("d", 8);
+ hm.put("e", 6);
+ hm.put("f", 0);
+ Iterator> iter2 = hm.entrySet().iterator();
+ while (iter2.hasNext()){
+ Map.Entry entry = iter2.next();
+ System.out.println(entry.getKey() + "/" + entry.getValue());
+ }
+
+ }
+
+}
diff --git a/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkMap.java b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkMap.java
new file mode 100644
index 0000000..cfc23b6
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkMap.java
@@ -0,0 +1,53 @@
+package ru.geekbrains.java2.lesson_03.Classwork;
+// video 2:10
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class ClassWorkMap {
+ public static void main(String[] args) {
+ HashMap capitalCities = new HashMap<>();
+ capitalCities.put("France", "Paris");
+ capitalCities.put("Russia", "Moscow");
+ capitalCities.put("England", "Lonon");
+
+ System.out.println(capitalCities);
+ System.out.println(capitalCities.get("France"));
+ System.out.println(capitalCities.get("Russia"));
+
+ System.out.println(capitalCities.getOrDefault("England", "Нету нифига"));
+ System.out.println(capitalCities.getOrDefault("Finland", "Нету нифига"));
+ System.out.println();
+
+ long time;
+
+ time = System.currentTimeMillis();
+ ArrayList strAL = new ArrayList<>(1_000_000);
+ for (int i = 0; i < 1_000_000; i++) {
+ strAL.add("Entry #" + i);
+ }
+ System.out.print("Заполнение ArrayList: ");
+ System.out.println(System.currentTimeMillis() - time);
+
+ time = System.currentTimeMillis();
+ HashMap strIntHM = new HashMap<>();
+ for (int i = 0; i < 1_000_000; i++) {
+ strIntHM.put("Entry #" + i, i);
+ }
+ System.out.print("Заполнение HashMap: ");
+ System.out.println(System.currentTimeMillis() - time);
+
+ time = System.currentTimeMillis();
+ for (int i = 0; i < 1000; i++) {
+ strAL.contains("Entry #522343");
+ }
+ System.out.print("Поиск в ArrayList: ");
+ System.out.println(System.currentTimeMillis() - time);
+
+ time = System.currentTimeMillis();
+ for (int i = 0; i < 1000; i++) {
+ strIntHM.containsKey("Entry #522343");
+ }
+ System.out.print("Поиск в HashMap: ");
+ System.out.println(System.currentTimeMillis() - time);
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkSet.java b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkSet.java
new file mode 100644
index 0000000..fb86728
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_03/Classwork/ClassWorkSet.java
@@ -0,0 +1,39 @@
+package ru.geekbrains.java2.lesson_03.Classwork;
+
+import java.util.HashSet;
+import java.util.TreeSet;
+
+public class ClassWorkSet {
+ public static void main(String[] args) {
+ HashSet hSet = new HashSet<>();
+ hSet.add("K");
+ hSet.add("tSet");
+ hSet.add("C");
+ hSet.add("E");
+ hSet.add("C");
+ hSet.add("static");
+ hSet.add("add");
+ hSet.add("A");
+ hSet.add("tSet");
+ hSet.add("main");
+ hSet.add("main");
+ hSet.add("addddddd");
+ System.out.println(hSet);
+
+ TreeSet tSet = new TreeSet<>();
+ tSet.add("K");
+ tSet.add("tSet");
+ tSet.add("C");
+ tSet.add("E");
+ tSet.add("C");
+ tSet.add("static");
+ tSet.add("add");
+ tSet.add("A");
+ tSet.add("tSet");
+ tSet.add("main");
+ tSet.add("main");
+ tSet.add("addddddd");
+ System.out.println(tSet);
+
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_03/Homework.java b/src/ru/geekbrains/java2/lesson_03/Homework.java
new file mode 100644
index 0000000..24650dd
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_03/Homework.java
@@ -0,0 +1,43 @@
+package ru.geekbrains.java2.lesson_03;
+
+import java.util.*;
+
+public class Homework {
+ public static void main(String[] args) {
+ task1();
+ System.out.println("\n");
+
+ Phonebook phonebook = new Phonebook();
+ phonebook.add("Ясенев", "5738665");
+ phonebook.add("Сидоров", "2860675");
+ phonebook.add("Иванов", "23456");
+ phonebook.add("Петров", "87748");
+ phonebook.add("Иванов", "9563827");
+ phonebook.add("Арбузов", "6749857");
+
+ System.out.println("Иванов: " + phonebook.get("Иванов"));
+ System.out.println();
+ phonebook.allInfo();
+ }
+
+ private static void task1(){
+ String[] words = {"Создать", "массив", "набором", "слов",
+ "слов", "должны", "массив", "набором", "встречаться",
+ "повторяющиеся", "набором", "встречаться",
+ "повторяющиеся","Создать", "массив", "набором",
+ "должны", "массив", "набором", "уникальный"};
+ HashSet stringSet = new HashSet<>(Arrays.asList(words));
+ System.out.println(stringSet);
+
+ HashMap hMap = new HashMap<>();
+
+ for (String s : words)
+ hMap.put(s, hMap.getOrDefault(s, 0) + 1);
+
+ Iterator> iterM = hMap.entrySet().iterator();
+ while (iterM.hasNext()){
+ Map.Entry entry = iterM.next();
+ System.out.printf("%s - %d раз\n", entry.getKey(), entry.getValue());
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_03/Phonebook.java b/src/ru/geekbrains/java2/lesson_03/Phonebook.java
new file mode 100644
index 0000000..659431d
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_03/Phonebook.java
@@ -0,0 +1,28 @@
+package ru.geekbrains.java2.lesson_03;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class Phonebook {
+ private TreeMap> directory;
+
+ public Phonebook() {
+ directory = new TreeMap<>();
+ }
+
+ public void add(String family, String phone){
+ if (!directory.containsKey(family)) directory.put(family, new HashSet<>());
+ directory.get(family).add(phone);
+ }
+
+ public String get(String family){
+ return directory.get(family).toString();
+ }
+
+ public void allInfo(){
+ for (Map.Entry> entry: directory.entrySet()){
+ System.out.println(entry.getKey() + "/" + entry.getValue().toString());
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_04/Classwork/MainClass.java b/src/ru/geekbrains/java2/lesson_04/Classwork/MainClass.java
new file mode 100644
index 0000000..61ca2cb
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_04/Classwork/MainClass.java
@@ -0,0 +1,7 @@
+package ru.geekbrains.java2.lesson_04.Classwork;
+
+public class MainClass {
+ public static void main(String[] args) {
+ MyWindow window = new MyWindow();
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_04/Classwork/MyHintTextfield.java b/src/ru/geekbrains/java2/lesson_04/Classwork/MyHintTextfield.java
new file mode 100644
index 0000000..158a1b7
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_04/Classwork/MyHintTextfield.java
@@ -0,0 +1,21 @@
+package ru.geekbrains.java2.lesson_04.Classwork;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class MyHintTextfield extends JTextField {
+ private String hint;
+
+ public MyHintTextfield(int columns, String hint) {
+ super(columns);
+ this.hint = hint;
+ }
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ if(getText().isEmpty() && !hasFocus()){
+ g.drawString(hint, 2, 26);
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_04/Classwork/MyWindow.java b/src/ru/geekbrains/java2/lesson_04/Classwork/MyWindow.java
new file mode 100644
index 0000000..fd02b1a
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_04/Classwork/MyWindow.java
@@ -0,0 +1,77 @@
+package ru.geekbrains.java2.lesson_04.Classwork;
+// video 2:17
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionAdapter;
+
+public class MyWindow extends JFrame {
+ private JTextField textField;
+ private JTextArea textArea;
+
+ public MyWindow() {
+ setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+ setTitle("My application");
+ setBounds(750, 250, 400, 445);
+
+ Font arial18 = new Font("Arial", Font.BOLD, 18);
+
+ JButton button1 = new JButton("Button 1");
+ JButton button2 = new JButton("Button 2");
+ textField = new MyHintTextfield(32, "Введите сообщение");
+ textField.setFont(arial18);
+ textField.setPreferredSize(new Dimension(250, 40));
+ JPanel upPanel = new JPanel(new BorderLayout());
+
+ upPanel.add(button1, BorderLayout.WEST);
+ upPanel.add(textField, BorderLayout.CENTER);
+ upPanel.add(button2, BorderLayout.EAST);
+ add(upPanel, BorderLayout.NORTH);
+
+ JList membersList = new JList<>(new DefaultListModel<>());
+ add(membersList, BorderLayout.EAST);
+ membersList.setPreferredSize(new Dimension(100, 1));
+ ((DefaultListModel)membersList.getModel()).addElement("member1");
+ ((DefaultListModel)membersList.getModel()).addElement("abrakadabra");
+ ((DefaultListModel)membersList.getModel()).addElement("noNickName");
+
+ textArea = new JTextArea(20, 32);
+ textArea.setLineWrap(true);
+ textArea.setEditable(false);
+ textArea.setFont(arial18);
+ JScrollPane scrollPane = new JScrollPane(textArea);
+ add(scrollPane, BorderLayout.CENTER);
+
+ button1.addActionListener(e -> JOptionPane.showMessageDialog(null,
+ "Перегрев процессора", "Внимание!!!", JOptionPane.WARNING_MESSAGE));
+ button2.addActionListener(e -> sendMsg());
+ textField.addActionListener(e -> sendMsg());
+
+ button1.addMouseMotionListener(new MouseMotionAdapter() {
+ @Override
+ public void mouseDragged(MouseEvent e) {
+ super.mouseDragged(e);
+ button1.setBackground(new Color(0xAC2521));
+ }
+
+ @Override
+ public void mouseMoved(MouseEvent e) {
+ super.mouseMoved(e);
+ button1.setBackground(new Color(0x0AAC1A));
+ }
+ });
+
+ setVisible(true);
+ }
+
+ public void sendMsg() {
+ String meggage = textField.getText();
+ if (!meggage.isEmpty()) {
+ textArea.append(textField.getText() + "\n");
+ textField.setText("");
+ }
+ textField.grabFocus();
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_04/GeekChatWindow.java b/src/ru/geekbrains/java2/lesson_04/GeekChatWindow.java
new file mode 100644
index 0000000..bff321d
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_04/GeekChatWindow.java
@@ -0,0 +1,99 @@
+package ru.geekbrains.java2.lesson_04;
+
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class GeekChatWindow extends JFrame {
+ private HintTextField nicknameField;
+ private HintTextField messageField;
+ private JTextArea chatArea;
+ private JList membersList;
+
+ public GeekChatWindow(String title) {
+ setTitle(title);
+ setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+ setBounds(750, 150, 500, 800);
+ Font arial18 = new Font("Arial", Font.PLAIN, 18);
+
+ JLabel nickLable = new JLabel("Никнейм: ");
+ nickLable.setFont(arial18);
+
+ nicknameField = new HintTextField(28, "Введите ваш ник");
+ nicknameField.setFont(arial18);
+ nicknameField.setPreferredSize(new Dimension(1, 32));
+
+ JPanel nickPanel = new JPanel(new BorderLayout());
+ nickPanel.setBorder(new EmptyBorder(3, 5, 2, 5));
+ nickPanel.add(nickLable, BorderLayout.WEST);
+ nickPanel.add(nicknameField, BorderLayout.CENTER);
+ add(nickPanel, BorderLayout.NORTH);
+
+ messageField = new HintTextField(30, "Введите сообщение");
+ messageField.setFont(arial18);
+ messageField.setPreferredSize(new Dimension(1, 32));
+ messageField.addActionListener(new SendMessage());
+
+ JButton sendButton = new JButton("Отправить");
+ sendButton.setFont(arial18);
+ sendButton.addActionListener(new SendMessage());
+
+ JPanel messagePanel = new JPanel(new BorderLayout());
+ messagePanel.setBorder(new EmptyBorder(2, 5, 2, 5));
+ messagePanel.add(messageField, BorderLayout.CENTER);
+ messagePanel.add(sendButton, BorderLayout.EAST);
+ add(messagePanel, BorderLayout.SOUTH);
+
+ chatArea = new JTextArea(20, 30);
+ chatArea.setFont(arial18);
+ chatArea.setLineWrap(true);
+ chatArea.setWrapStyleWord(true);
+ chatArea.setEditable(false);
+ chatArea.append("member1: добрый вечер всем, а в чём суть Дз?\n" +
+ "там же есть готовый код уже, на уроке проходили, просто самому разобраться и переписать?\n\n" +
+ "abrakadabra : Добрый. Именно так\n\n" +
+ "noNickName: Вообще по заданию ДЗ окно чата выглядеть должно немного иначе.\n\n");
+
+ JScrollPane chatScroller = new JScrollPane(chatArea);
+ add(chatScroller, BorderLayout.CENTER);
+
+ membersList = new JList<>(new DefaultListModel<>());
+ membersList.setPreferredSize(new Dimension(100, 1));
+ ((DefaultListModel) membersList.getModel()).addElement("member1");
+ ((DefaultListModel) membersList.getModel()).addElement("abrakadabra");
+ ((DefaultListModel) membersList.getModel()).addElement("noNickName");
+
+ JLabel membersLable = new JLabel("Участники:");
+
+ JPanel membersPanel = new JPanel(new BorderLayout());
+ membersPanel.setBorder(new EmptyBorder(4, 4, 4, 4));
+ membersPanel.add(membersLable, BorderLayout.NORTH);
+ membersPanel.add(membersList, BorderLayout.CENTER);
+
+ JScrollPane memberScroller = new JScrollPane(membersPanel);
+ add(memberScroller, BorderLayout.EAST);
+
+
+ setVisible(true);
+ }
+
+ class SendMessage implements ActionListener {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (!messageField.getText().isEmpty()) {
+ String nickname = nicknameField.getText();
+
+ if (nickname.isEmpty()) nickname = "unknown";
+ else if (!((DefaultListModel) membersList.getModel()).contains(nicknameField.getText()))
+ ((DefaultListModel) membersList.getModel()).addElement(nicknameField.getText());
+
+ chatArea.append(nickname + ": " + messageField.getText() + "\n\n");
+ messageField.setText("");
+ messageField.grabFocus();
+ }
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_04/HintTextField.java b/src/ru/geekbrains/java2/lesson_04/HintTextField.java
new file mode 100644
index 0000000..f2fd7c1
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_04/HintTextField.java
@@ -0,0 +1,23 @@
+package ru.geekbrains.java2.lesson_04;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class HintTextField extends JTextField {
+ private String hint;
+
+ public HintTextField(int columns, String hint) {
+ super(30);
+ this.hint = hint;
+
+ }
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ if (getText().isEmpty()){
+ g.setColor(new Color(0x737EFF));
+ g.drawString(hint, 2, 22);
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_04/Homework.java b/src/ru/geekbrains/java2/lesson_04/Homework.java
new file mode 100644
index 0000000..d15c949
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_04/Homework.java
@@ -0,0 +1,11 @@
+package ru.geekbrains.java2.lesson_04;
+
+import ru.geekbrains.java2.lesson_04.Classwork.MyWindow;
+
+public class Homework {
+ public static final String version = "v 0.0.0.1";
+
+ public static void main(String[] args) {
+ new GeekChatWindow("Geek Chat " + version);
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/Classwork/Counter.java b/src/ru/geekbrains/java2/lesson_05/Classwork/Counter.java
new file mode 100644
index 0000000..2f86959
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/Classwork/Counter.java
@@ -0,0 +1,21 @@
+package ru.geekbrains.java2.lesson_05.Classwork;
+
+public class Counter {
+ private int c;
+
+ public Counter() {
+ c = 0;
+ }
+
+ public int value() {
+ return c;
+ }
+
+ public synchronized void inc() {
+ c++;
+ }
+
+ public synchronized void dec(){
+ c--;
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/Classwork/Example_SB_1.java b/src/ru/geekbrains/java2/lesson_05/Classwork/Example_SB_1.java
new file mode 100644
index 0000000..7c878ff
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/Classwork/Example_SB_1.java
@@ -0,0 +1,36 @@
+package ru.geekbrains.java2.lesson_05.Classwork;
+
+public class Example_SB_1 {
+ public static void main(String[] args) {
+ Example_SB_1 e1 = new Example_SB_1();
+ System.out.println("Start");
+ new Thread(() -> e1.method1()).start();
+ new Thread(() -> e1.method2()).start();
+ }
+
+ public synchronized void method1() {
+ System.out.println("M1");
+ for (int i = 0; i < 10; i++) {
+ System.out.println(i);
+ try {
+ Thread.sleep(101);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ System.out.println("M2");
+ }
+
+ public synchronized void method2() {
+ System.out.println("M1");
+ for (int i = 0; i < 10; i++) {
+ System.out.println(i);
+ try {
+ Thread.sleep(102);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ System.out.println("M2");
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/Classwork/Example_SB_2.java b/src/ru/geekbrains/java2/lesson_05/Classwork/Example_SB_2.java
new file mode 100644
index 0000000..5babb64
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/Classwork/Example_SB_2.java
@@ -0,0 +1,36 @@
+package ru.geekbrains.java2.lesson_05.Classwork;
+
+public class Example_SB_2 {
+ private Object lock1 = new Object ();
+ public static void main ( String [] args ) {
+ Example_SB_2 e2 = new Example_SB_2 ();
+ System . out . println ( "Start" );
+ new Thread (() -> e2 . method1 ()). start ();
+ new Thread (() -> e2 . method1 ()). start ();
+ }
+ public void method1 () {
+ System . out . println ( "Block-1 begin" );
+ for ( int i = 100 ; i < 103 ; i ++) {
+ System . out . println ( i );
+ try {
+ Thread . sleep ( 100 );
+ } catch ( InterruptedException e ) {
+ e . printStackTrace ();
+ }
+ }
+ System . out . println ( "Block-1 end" );
+ synchronized (lock1){
+ System.out.println("Synch block begin");
+ for (int i = 0; i < 10; i++) {
+ System.out.println(i);
+ try {
+ Thread.sleep(103);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ System.out.println("Synch block end");
+ }
+ System . out . println ( "M2" );
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/Classwork/Example_SB_3.java b/src/ru/geekbrains/java2/lesson_05/Classwork/Example_SB_3.java
new file mode 100644
index 0000000..2874e58
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/Classwork/Example_SB_3.java
@@ -0,0 +1,20 @@
+package ru.geekbrains.java2.lesson_05.Classwork;
+
+public class Example_SB_3 {
+ public static void main(String[] args) {
+ System.out.println("Start");
+ new Thread(() -> method()).start();
+ new Thread(() -> method()).start();
+ }
+
+ public synchronized static void method() { // синхронизация по классу
+ for (int i = 0; i < 10; i++) {
+ System.out.println(i + " " + Thread.currentThread().getName());
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/Classwork/MainClass.java b/src/ru/geekbrains/java2/lesson_05/Classwork/MainClass.java
new file mode 100644
index 0000000..1ab3bd9
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/Classwork/MainClass.java
@@ -0,0 +1,109 @@
+package ru.geekbrains.java2.lesson_05.Classwork;
+
+public class MainClass {
+ public static void main(String[] args) {
+ /*System.out.println(Thread.currentThread().getName());
+
+ MyThread myT1 = new MyThread();
+ MyThread myT2 = new MyThread();
+ myT1.start();
+ myT2.start();
+
+ Thread myR3 = new Thread(new MyRunnable());
+ Thread myR4 = new Thread(new MyRunnable());
+ myR3.start();
+ myR4.start();
+ try {
+ Thread.sleep(200);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.println("end");*/
+
+ /* Thread th1 = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ for (int i = 1; i < 6; i++) {
+ System.out.println(i);
+ }
+ }
+ });
+
+ Thread th2 = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ for (int i = 11; i < 16; i++) {
+ System.out.println(i);
+ }
+ }
+ });
+
+ th1.start();
+ th2.start();
+
+ try {
+ th1.join();
+ th2.join();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.println("end");*/
+
+ /* Thread th = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ int time = 0;
+ while (true){
+ time++;
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.println(time);
+ }
+ }
+ });
+ th.setDaemon(true);
+ th.start();
+
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ System.out.println("end");*/
+
+ Counter counter = new Counter();
+
+ Thread th1 = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ for (int i = 0; i < 100; i++) {
+ counter.inc();
+ }
+ }
+ });
+
+ Thread th2 = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ for (int i = 0; i < 100; i++) {
+ counter.dec();
+ }
+ }
+ });
+
+ th1.start();
+ th2.start();
+
+ try {
+ th1.join();
+ th2.join();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ System.out.println(counter.value());
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/Classwork/MyRunnable.java b/src/ru/geekbrains/java2/lesson_05/Classwork/MyRunnable.java
new file mode 100644
index 0000000..c9bb966
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/Classwork/MyRunnable.java
@@ -0,0 +1,11 @@
+package ru.geekbrains.java2.lesson_05.Classwork;
+
+public class MyRunnable implements Runnable {
+ @Override
+ public void run() {
+ for (int i = 0; i < 10; i++) {
+ System.out.println(i + " " + Thread.currentThread().getName());
+ }
+
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/Classwork/MyThread.java b/src/ru/geekbrains/java2/lesson_05/Classwork/MyThread.java
new file mode 100644
index 0000000..2c8418b
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/Classwork/MyThread.java
@@ -0,0 +1,10 @@
+package ru.geekbrains.java2.lesson_05.Classwork;
+
+public class MyThread extends Thread {
+ @Override
+ public void run() {
+ for (int i = 0; i < 10; i++) {
+ System.out.println(i + " " + Thread.currentThread().getName());
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/Homework.java b/src/ru/geekbrains/java2/lesson_05/Homework.java
new file mode 100644
index 0000000..17b943a
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/Homework.java
@@ -0,0 +1,30 @@
+package ru.geekbrains.java2.lesson_05;
+
+import java.util.Arrays;
+
+public class Homework {
+ private static final int SIZE = 10000000;
+
+ public static void main(String[] args) {
+ long startTime;
+
+ float[] arr = new float[SIZE];
+ Arrays.fill(arr, 1f);
+
+ startTime = System.currentTimeMillis();
+ MonothreadedCalculate.calc(arr.clone());
+ System.out.println("Вычисление в однопоточном методе заняло " +
+ (float) (System.currentTimeMillis() - startTime) / 1000 + " сек.");
+
+ startTime = System.currentTimeMillis();
+ TwothreadedCalculate.calc(arr.clone());
+ System.out.println("Вычисление в двухпоточном методе заняло " +
+ (float) (System.currentTimeMillis() - startTime) / 1000 + " сек.");
+
+ startTime = System.currentTimeMillis();
+ MultithreadedCalculate.calc(arr.clone());
+ System.out.println("Вычисление в многопоточном методе заняло " +
+ (float) (System.currentTimeMillis() - startTime) / 1000 + " сек.");
+ }
+}
+
diff --git a/src/ru/geekbrains/java2/lesson_05/MonothreadedCalculate.java b/src/ru/geekbrains/java2/lesson_05/MonothreadedCalculate.java
new file mode 100644
index 0000000..50c02ff
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/MonothreadedCalculate.java
@@ -0,0 +1,9 @@
+package ru.geekbrains.java2.lesson_05;
+
+public class MonothreadedCalculate {
+ public static void calc(float arr[]) {
+ for (int i = 0; i < arr.length; i++) {
+ arr[i] = (float) (arr[i] * Math.sin(0.2f + i / 5) * Math.cos(0.2f + i / 5) * Math.cos(0.4f + i / 2));
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/MultithreadedCalculate.java b/src/ru/geekbrains/java2/lesson_05/MultithreadedCalculate.java
new file mode 100644
index 0000000..67778c4
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/MultithreadedCalculate.java
@@ -0,0 +1,52 @@
+package ru.geekbrains.java2.lesson_05;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class MultithreadedCalculate {
+ private static final int PARTSIZE = 100000; // РЕГУЛИРОВАТЬ КОЛ-ВО ПОТОКОВ МОЖНО ЭТОЙ ВЕЛИЧИНОЙ
+
+ public static void calc(float arr[]) {
+ ArrayList arrayList = new ArrayList<>();
+
+ int currentLocatin = 0;
+ int nextLocation = PARTSIZE;
+
+ while (currentLocatin < arr.length) {
+ if (nextLocation < arr.length)
+ arrayList.add(Arrays.copyOfRange(arr, currentLocatin, nextLocation));
+ else
+ arrayList.add(Arrays.copyOfRange(arr, currentLocatin, arr.length));
+ currentLocatin = nextLocation;
+ nextLocation += PARTSIZE;
+ }
+
+ currentLocatin = 0;
+ ArrayList threadList = new ArrayList<>();
+ for (float[] a : arrayList) {
+ Thread tmp = new Thread(new ThreadOfCalculation(a, currentLocatin));
+ currentLocatin += PARTSIZE;
+ threadList.add(tmp);
+ tmp.start();
+ }
+
+ for (Thread h : threadList) {
+ try {
+ h.join();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ currentLocatin = 0;
+ for (float[] a : arrayList) {
+ System.arraycopy(a, 0, arr, currentLocatin, a.length);
+ // раскоментить цикл ниже для вывода границ склейки массивов
+ for (int i = currentLocatin; i < currentLocatin + PARTSIZE; i++) {
+ System.out.println("arr[" + i + "]: " + arr[i]);
+ if (i > currentLocatin + 2 && i < currentLocatin + PARTSIZE - 3) i = currentLocatin + PARTSIZE - 3;
+ }
+ currentLocatin += PARTSIZE;
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/ThreadOfCalculation.java b/src/ru/geekbrains/java2/lesson_05/ThreadOfCalculation.java
new file mode 100644
index 0000000..98d2dea
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/ThreadOfCalculation.java
@@ -0,0 +1,19 @@
+package ru.geekbrains.java2.lesson_05;
+
+public class ThreadOfCalculation implements Runnable {
+ private float arr[];
+ private int offset;
+
+ public ThreadOfCalculation(float[] arr, int offset) {
+ this.arr = arr;
+ this.offset = offset;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < arr.length; i++) {
+ int j = i + offset;
+ arr[i] = (float) (arr[i] * Math.sin(0.2f + j / 5) * Math.cos(0.2f + j / 5) * Math.cos(0.4f + j / 2));
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_05/TwothreadedCalculate.java b/src/ru/geekbrains/java2/lesson_05/TwothreadedCalculate.java
new file mode 100644
index 0000000..635b189
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_05/TwothreadedCalculate.java
@@ -0,0 +1,24 @@
+package ru.geekbrains.java2.lesson_05;
+
+import java.util.Arrays;
+
+public class TwothreadedCalculate {
+ public static void calc(float arr[]){
+ int half = arr.length / 2;
+ float[] arr1 = Arrays.copyOfRange(arr, 0, half);
+ float[] arr2 = Arrays.copyOfRange(arr, half, arr.length);
+ Thread th1 = new Thread(new ThreadOfCalculation(arr1, 0));
+ Thread th2 = new Thread(new ThreadOfCalculation(arr2, half));
+ th1.start();
+ th2.start();
+ try {
+ th1.join();
+ th2.join();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ System.arraycopy(arr1, 0, arr, 0, half);
+ System.arraycopy(arr2, 0, arr, half, half);
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_06/Classwork/client/Controller.java b/src/ru/geekbrains/java2/lesson_06/Classwork/client/Controller.java
new file mode 100644
index 0000000..ff76fa0
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/Classwork/client/Controller.java
@@ -0,0 +1,74 @@
+package ru.geekbrains.java2.lesson_06.Classwork.client;
+
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.Button;
+import javafx.scene.control.TextArea;
+import javafx.scene.control.TextField;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.net.URL;
+import java.util.ResourceBundle;
+
+public class Controller implements Initializable {
+ public static final String SERVER_IP = "localhost";
+ public static final int SERVER_PORT = 8189;
+
+ @FXML
+ public TextArea chatArea;
+ @FXML
+ public TextField msgField;
+// public Button sendButton;
+
+ private Socket socket;
+ private DataOutputStream out;
+
+ @Override
+ public void initialize(URL location, ResourceBundle resources) {
+ try {
+ socket = new Socket(SERVER_IP, SERVER_PORT);
+ DataInputStream in = new DataInputStream(socket.getInputStream());
+ out = new DataOutputStream(socket.getOutputStream());
+ Thread thread = new Thread(() -> {
+ String msg = "";
+ try {
+ while (!msg.equals("echo answer: /end")) {
+ msg = in.readUTF();
+ chatArea.appendText(msg + "\n");
+ }
+ chatArea.appendText("соединение разорвано\n");
+ } catch (IOException e) {
+ System.err.println("Сервер рвзорвал соединение");
+ e.printStackTrace();
+// System.exit(0);
+ }
+ try {
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ });
+ thread.setDaemon(true);
+ thread.start();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void sendMsg() {
+ if (!msgField.getText().equals(""))
+ try {
+ out.writeUTF(msgField.getText());
+ out.flush();
+ msgField.clear();
+ msgField.requestFocus();
+ } catch (IOException e) {
+ chatArea.appendText("нет связи с сервером\n");
+ }
+ }
+
+}
+
diff --git a/src/ru/geekbrains/java2/lesson_06/Classwork/client/Main.java b/src/ru/geekbrains/java2/lesson_06/Classwork/client/Main.java
new file mode 100644
index 0000000..4c4e59b
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/Classwork/client/Main.java
@@ -0,0 +1,23 @@
+package ru.geekbrains.java2.lesson_06.Classwork.client;
+
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+
+public class Main extends Application {
+
+ @Override
+ public void start(Stage primaryStage) throws Exception{
+ Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
+ primaryStage.setTitle("Geek JavaFX chat");
+ primaryStage.setScene(new Scene(root, 400, 600));
+ primaryStage.show();
+ }
+
+
+ public static void main(String[] args) {
+ launch(args);
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_06/Classwork/client/sample.fxml b/src/ru/geekbrains/java2/lesson_06/Classwork/client/sample.fxml
new file mode 100644
index 0000000..13236a6
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/Classwork/client/sample.fxml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/ru/geekbrains/java2/lesson_06/Classwork/server/ServerMain.java b/src/ru/geekbrains/java2/lesson_06/Classwork/server/ServerMain.java
new file mode 100644
index 0000000..0824ea7
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/Classwork/server/ServerMain.java
@@ -0,0 +1,34 @@
+package ru.geekbrains.java2.lesson_06.Classwork.server;
+
+import java.io.*;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+public class ServerMain {
+ public static void main(String[] args) {
+ try {
+ ServerSocket serverSocket = new ServerSocket(8189);
+ System.out.println("Server started...");
+ Socket socket = serverSocket.accept();
+ System.out.println("Client connected.");
+
+ DataInputStream scanner = new DataInputStream(socket.getInputStream());
+ DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
+
+ String msg = "";
+ while (!msg.equals("/end")) {
+ msg = scanner.readUTF();
+ System.out.println("Client said: " + msg);
+ writer.writeUTF("echo answer: " + msg);
+ writer.flush();
+ }
+ System.out.println("Command for disconnect");
+ socket.close();
+ System.out.println("Server stopped...");
+ } catch (IOException e) {
+ System.err.println("Потеря связи");
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_06/Client.java b/src/ru/geekbrains/java2/lesson_06/Client.java
new file mode 100644
index 0000000..430ea4a
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/Client.java
@@ -0,0 +1,24 @@
+package ru.geekbrains.java2.lesson_06;
+
+import java.io.IOException;
+import java.net.Socket;
+
+public class Client {
+ public static final String SERVER_IP = "localhost";
+ public static final int SERVER_PORT = 8189;
+
+ public static void main(String[] args) {
+ Socket socket;
+ try {
+ socket = new Socket(SERVER_IP, SERVER_PORT);
+ System.out.println("Connected to server...");
+
+ NetTransceiver netTransceiver = new NetTransceiver("Client", socket);
+ netTransceiver.start();
+
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_06/NetTransceiver.java b/src/ru/geekbrains/java2/lesson_06/NetTransceiver.java
new file mode 100644
index 0000000..d923297
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/NetTransceiver.java
@@ -0,0 +1,88 @@
+// ВОПРОС: не могу прервать поток, который заблокирован Scanerом, как это можно сделать
+// может вместо Scanera чтот-то прерываемое можно использовать
+// если можно уделите на уроке этому пару минут пожалуйста
+
+package ru.geekbrains.java2.lesson_06;
+
+import java.io.*;
+import java.net.Socket;
+import java.util.Scanner;
+
+public class NetTransceiver {
+ private String name;
+ private Socket socket;
+ private DataInputStream inputStream;
+ private DataOutputStream outputStream;
+ private Scanner scanner;
+ private Thread listner;
+ private Thread sender;
+
+ public NetTransceiver(String name, Socket socket) {
+ this.name = name;
+ this.socket = socket;
+ }
+
+ public void start() {
+ try {
+ inputStream = new DataInputStream(socket.getInputStream());
+ outputStream = new DataOutputStream(socket.getOutputStream());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ listner = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ String message = "";
+ while (!Thread.interrupted()) {
+ try {
+ message = inputStream.readUTF();
+ } catch (IOException e) {
+ System.out.println("program is stopped");
+ break;
+ }
+ System.out.println(message);
+ if (message.contains("/end"))
+ Thread.currentThread().interrupt();
+ }
+ sender.interrupt();
+ scanner.close(); // ни как не могу прервать поток
+ }
+ });
+
+ sender = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ scanner = new Scanner(System.in);
+ String message = "";
+ while (!Thread.interrupted()) {
+ message = scanner.nextLine();
+ try {
+ outputStream.writeUTF(name + ": " + message);
+ outputStream.flush();
+ } catch (IOException e) {
+ System.out.println("program is stoped");
+ break;
+ }
+ if (message.contains("/end"))
+ Thread.currentThread().interrupt();
+ }
+ listner.interrupt();
+ try {
+ inputStream.close(); // а этот рвется, правда, на мой взгляд, грубо
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+
+ listner.start();
+ sender.start();
+ try {
+ listner.join();
+ sender.join();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_06/Server.java b/src/ru/geekbrains/java2/lesson_06/Server.java
new file mode 100644
index 0000000..2f9ddcb
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/Server.java
@@ -0,0 +1,29 @@
+package ru.geekbrains.java2.lesson_06;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+public class Server {
+ public static final int SERVER_PORT = 8189;
+ public static void main(String[] args) {
+ Socket socket;
+ try {
+ ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
+ System.out.println("Server started...");
+ socket = serverSocket.accept();
+ System.out.println("Client connected...");
+
+ NetTransceiver netTransceiver = new NetTransceiver("Server", socket);
+ netTransceiver.start();
+
+ serverSocket.close();
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+}
diff --git a/src/ru/geekbrains/java2/lesson_06/metodichka/Client.java b/src/ru/geekbrains/java2/lesson_06/metodichka/Client.java
new file mode 100644
index 0000000..b5fcd4a
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/metodichka/Client.java
@@ -0,0 +1,8 @@
+package ru.geekbrains.java2.lesson_06.metodichka;
+
+public class Client {
+ public static void main(String[] args) {
+ new MyWindow();
+ }
+}
+
diff --git a/src/ru/geekbrains/java2/lesson_06/metodichka/MyWindow.java b/src/ru/geekbrains/java2/lesson_06/metodichka/MyWindow.java
new file mode 100644
index 0000000..6db6c75
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/metodichka/MyWindow.java
@@ -0,0 +1,96 @@
+package ru.geekbrains.java2.lesson_06.metodichka;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.Socket;
+import java.util.Scanner;
+
+public class MyWindow extends JFrame {
+ private JTextField textField;
+ private JTextArea textArea;
+ private final String SERVER_ADDR = "localhost";
+ private final int SERVER_PORT = 8189;
+ private Socket sock;
+ private Scanner in;
+ private PrintWriter out;
+
+ public MyWindow() {
+ try {
+ sock = new Socket(SERVER_ADDR, SERVER_PORT);
+ in = new Scanner(sock.getInputStream());
+ out = new PrintWriter(sock.getOutputStream());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ setBounds(600, 300, 500, 500);
+ setTitle("Client");
+ setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+
+ textArea = new JTextArea();
+ textArea.setEditable(false);
+ textArea.setLineWrap(true);
+
+ JScrollPane scrollPane = new JScrollPane(textArea);
+ add(scrollPane, BorderLayout.CENTER);
+
+ JPanel bottomPanel = new JPanel(new BorderLayout());
+ add(bottomPanel, BorderLayout.SOUTH);
+
+ JButton sendButton = new JButton("SEND");
+ bottomPanel.add(sendButton, BorderLayout.EAST);
+
+ textField = new JTextField();
+ bottomPanel.add(textField, BorderLayout.CENTER);
+
+ sendButton.addActionListener(e -> sendMsg());
+ textField.addActionListener(e -> sendMsg());
+
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ while (true) {
+ if (in.hasNext()) {
+ String w = in.nextLine();
+ if (w.equalsIgnoreCase("end session")) break;
+ textArea.append(w);
+ textArea.append("\n");
+ }
+ }
+ } catch (Exception e) {
+ }
+ }
+ }).start();
+
+ addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ super.windowClosing(e);
+ try {
+ out.println("end");
+ out.flush();
+ sock.close();
+ out.close();
+ in.close();
+ } catch (IOException exc) {
+ }
+ }
+ });
+ setVisible(true);
+ }
+
+ public void sendMsg() {
+ if (!textField.getText().trim().isEmpty()) {
+ out.println(textField.getText());
+ out.flush();
+ textField.setText("");
+ textField.grabFocus();
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_06/metodichka/Server.java b/src/ru/geekbrains/java2/lesson_06/metodichka/Server.java
new file mode 100644
index 0000000..8c78aa5
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_06/metodichka/Server.java
@@ -0,0 +1,37 @@
+package ru.geekbrains.java2.lesson_06.metodichka;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.Scanner;
+
+public class Server {
+ public static void main(String[] args) {
+ ServerSocket serv = null;
+ Socket sock = null;
+ try {
+ serv = new ServerSocket(8189);
+ System.out.println("Сервер запущен, ожидаем подключения...");
+ sock = serv.accept();
+ System.out.println("Клиент подключился");
+ Scanner sc = new Scanner(sock.getInputStream());
+ PrintWriter pw = new PrintWriter(sock.getOutputStream());
+ while (true) {
+ String str = sc.nextLine();
+ if (str.equals("end")) break;
+ pw.println("Эхо: " + str);
+ pw.flush();
+ }
+ } catch (IOException e) {
+ System.out.println("Ошибка инициализации сервера");
+ } finally {
+ try {
+ assert serv != null;
+ serv.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ru/geekbrains/java2/lesson_07/Homework.java b/src/ru/geekbrains/java2/lesson_07/Homework.java
new file mode 100644
index 0000000..80224bc
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_07/Homework.java
@@ -0,0 +1,4 @@
+package ru.geekbrains.java2.lesson_07;
+
+public class Homework {
+}
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/JavaFX_chat.db b/src/ru/geekbrains/java2/lesson_07/javaFXChat/JavaFX_chat.db
new file mode 100644
index 0000000..eada1c5
Binary files /dev/null and b/src/ru/geekbrains/java2/lesson_07/javaFXChat/JavaFX_chat.db differ
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/Controller.java b/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/Controller.java
new file mode 100644
index 0000000..e315333
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/Controller.java
@@ -0,0 +1,186 @@
+package ru.geekbrains.java2.lesson_07.javaFXChat.client;
+
+import javafx.application.Platform;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.*;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.HBox;
+import javafx.util.Callback;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.net.URL;
+import java.util.ResourceBundle;
+
+public class Controller implements Initializable {
+ @FXML
+ TextArea textArea;
+ @FXML
+ TextField msgField;
+ @FXML
+ HBox loginPanel;
+ @FXML
+ HBox messagePanel;
+ @FXML
+ TextField loginField;
+ @FXML
+ PasswordField passFiead;
+ @FXML
+ ListView clientsListArea;
+ private ObservableList clientsObsvList;
+
+ private Socket socket;
+ private DataOutputStream out;
+ private DataInputStream in;
+ private String myNick;
+
+ final String SERVER_IP = "localhost";
+ final int SERVER_PORT = 8189;
+
+ public void setAutorized(boolean autorized) {
+ if (autorized) {
+ loginPanel.setVisible(false);
+ loginPanel.setManaged(false);
+ messagePanel.setVisible(true);
+ messagePanel.setManaged(true);
+ } else {
+ loginPanel.setVisible(true);
+ loginPanel.setManaged(true);
+ messagePanel.setVisible(false);
+ messagePanel.setManaged(false);
+ myNick = "";
+ }
+ }
+
+ @Override
+ public void initialize(URL location, ResourceBundle resources) {
+ setAutorized(false);
+ clientsObsvList = FXCollections.observableArrayList();
+ clientsListArea.setItems(clientsObsvList);
+ clientsListArea.setCellFactory(new Callback, ListCell>() {
+ @Override
+ public ListCell call(ListView param) {
+ return new ListCell() {
+ @Override
+ protected void updateItem(String item, boolean empty) {
+ super.updateItem(item, empty);
+ if (!empty) {
+ setText(item);
+ if (item.equals(myNick)) {
+ setStyle("-fx-font-weight: bold;" +
+ " -fx-background-color: #ffead4");
+ }
+ } else {
+ setGraphic(null);
+ setText(null);
+ }
+ }
+ };
+ }
+ });
+ }
+
+ public void connect() {
+ try {
+ socket = new Socket(SERVER_IP, SERVER_PORT);
+ in = new DataInputStream(socket.getInputStream());
+ out = new DataOutputStream(socket.getOutputStream());
+
+ Thread t = new Thread(() -> {
+ try {
+ while (true) {
+ String s = in.readUTF();
+ if (s.startsWith("/")) {
+ if (s.startsWith("/authok")) {
+ setAutorized(true);
+ myNick = s.split("\\s")[1];
+ textArea.appendText("успешная авторизация\n");
+ break;
+ }
+ if (s.startsWith("/timeout")) {
+ Platform.runLater(() -> showAlert("Соединение закрыто по таймауту"));
+ }
+ continue;
+ }
+ textArea.appendText(s + "\n");
+ }
+ while (true) {
+ String msg = in.readUTF();
+ if (msg.startsWith("/clients")) {
+ String[] clientsString = msg.substring(9).split(" ");
+ Platform.runLater(() -> {
+ clientsObsvList.clear();
+ clientsObsvList.addAll(clientsString);
+ });
+ continue;
+ }
+ textArea.appendText(msg + "\n");
+ }
+ } catch (IOException e) {
+ showAlert("Соединение с сервером разорвано.");
+ } finally {
+ setAutorized(false);
+ try {
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ t.setDaemon(true);
+ t.start();
+ } catch (IOException e) {
+ showAlert("Не удалось подключиться к серверу. Проверьте сетевое соединение.");
+ }
+ }
+
+ public void authorization() {
+ if (!loginField.getText().isEmpty() && !passFiead.getText().isEmpty()) {
+ if (socket == null || socket.isClosed()) connect();
+ try {
+ out.writeUTF("/auth " +
+ loginField.getText() + " " +
+ passFiead.getText());
+ loginField.clear();
+ passFiead.clear();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } else {
+ showAlert("Неполные данные для авторизации!");
+ }
+ }
+
+ public void sendMsg() {
+ try {
+ out.writeUTF(msgField.getText());
+ msgField.clear();
+ msgField.requestFocus();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void showAlert(String message) {
+ Platform.runLater(() -> {
+ Alert alert = new Alert(Alert.AlertType.INFORMATION);
+ alert.setTitle("Ой! Проблемка нарисавалася!");
+ alert.setHeaderText(null);
+ alert.setContentText(message);
+ alert.showAndWait();
+ });
+ }
+
+ public void clientChoise(MouseEvent event) {
+ if (event.getClickCount() == 2) {
+ msgField.setText("/w " + clientsListArea.getSelectionModel().getSelectedItem() + " ");
+ msgField.requestFocus();
+ msgField.selectEnd();
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/Main.java b/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/Main.java
new file mode 100644
index 0000000..d5e0391
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/Main.java
@@ -0,0 +1,23 @@
+package ru.geekbrains.java2.lesson_07.javaFXChat.client;
+
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+
+public class Main extends Application {
+
+ @Override
+ public void start(Stage primaryStage) throws Exception{
+ Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
+ primaryStage.setTitle("JavaFX project Client");
+ primaryStage.setScene(new Scene(root, 550, 800));
+ primaryStage.show();
+ }
+
+
+ public static void main(String[] args) {
+ launch(args);
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/mystyle.css b/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/mystyle.css
new file mode 100644
index 0000000..1f3a574
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/mystyle.css
@@ -0,0 +1,3 @@
+.list-cell:even{
+ -fx-background-color: #ddffe2;
+}
\ No newline at end of file
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/sample.fxml b/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/sample.fxml
new file mode 100644
index 0000000..adc6f7e
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_07/javaFXChat/client/sample.fxml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/AuthService.java b/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/AuthService.java
new file mode 100644
index 0000000..86a0aff
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/AuthService.java
@@ -0,0 +1,35 @@
+package ru.geekbrains.java2.lesson_07.javaFXChat.server;
+
+import java.sql.*;
+
+public class AuthService {
+ private Connection connection;
+ private Statement statement;
+
+ public void connect() throws ClassNotFoundException, SQLException{
+ Class.forName("org.sqlite.JDBC");
+ // как подключить базу, расположение которой отличается от корня проекта
+ connection = DriverManager.getConnection("jdbc:sqlite:JavaFX_chat.db");
+ statement = connection.createStatement();
+ }
+
+ public String getNickByLoginAndPass(String login, String pass){
+ try {
+ ResultSet rs = statement.executeQuery("SELECT nick FROM users where login='"+ login +"' and password='"+ pass +"';");
+ while (rs.next()){
+ return rs.getString("nick");
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public void disconnect(){
+ try {
+ connection.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/ClientHandler.java b/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/ClientHandler.java
new file mode 100644
index 0000000..beaaf29
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/ClientHandler.java
@@ -0,0 +1,103 @@
+package ru.geekbrains.java2.lesson_07.javaFXChat.server;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+
+public class ClientHandler {
+ private static final long TIMEOUT = 120_000;
+ private DataInputStream in;
+ private DataOutputStream out;
+ private String nick;
+
+ public String getNick() {
+ return nick;
+ }
+
+ public ClientHandler(Server server, Socket socket) {
+ try {
+ in = new DataInputStream(socket.getInputStream());
+ out = new DataOutputStream(socket.getOutputStream());
+ new Thread(() -> {
+ try {
+ while (true) {
+ String msg = in.readUTF();
+ if (msg.startsWith("/auth")) {
+ String[] authData = msg.split("\\s");
+
+ String newNick = null;
+
+ // fix bug (отправка пустых логина и пароля приводит к выходу за границы массива)
+ if (authData.length == 3)
+ newNick = server.getAuthService().getNickByLoginAndPass(authData[1], authData[2]);
+ if (newNick != null) {
+ if (server.isNickBusy(newNick)) {
+ sendMessage("данный пользователь уже авторизован");
+ continue;
+ }
+ nick = newNick;
+ sendMessage("/authok " + nick);
+ server.subscribe(this);
+ break;
+ } else {
+ sendMessage("Неверный логин/пароль");
+ }
+ }
+ }
+ while (true) {
+ String msg = in.readUTF();
+ System.out.println(nick + ": " + msg);
+
+ if (msg.startsWith("/")) {
+ if (msg.equals("/end")) break;
+ if (msg.startsWith("/w")) {
+ String[] data = msg.split("\\s", 3);
+ server.privateSender(this, data[1], data[2]);
+ }
+ continue;
+ }
+ server.broadcastSender(nick + ": " + msg);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ server.unsubscribe(this);
+ try {
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }).start();
+ new Thread(() -> {
+ try {
+ Thread.sleep(TIMEOUT);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ if(nick == null){
+ try {
+ sendMessage("/timeout");
+ socket.close();
+ in.close();
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ System.out.println("timeout");
+ }
+ }).start();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void sendMessage(String message) {
+ try {
+ out.writeUTF(message);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/Server.java b/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/Server.java
new file mode 100644
index 0000000..74303e1
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/Server.java
@@ -0,0 +1,90 @@
+package ru.geekbrains.java2.lesson_07.javaFXChat.server;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.sql.SQLException;
+import java.util.Vector;
+
+public class Server {
+ private Vector clientList;
+ private AuthService authService;
+
+ public AuthService getAuthService() {
+ return authService;
+ }
+
+ public Server(int port) {
+ try (ServerSocket serverSocket = new ServerSocket(port)) {
+ clientList = new Vector<>();
+
+ authService = new AuthService();
+ authService.connect();
+
+ System.out.println("Server started...Waiting for clients");
+ while (true) {
+ Socket socket = serverSocket.accept();
+ System.out.println("Client connected" +
+ socket.getInetAddress() + ":" +
+ socket.getPort() + ":" +
+ socket.getLocalPort());
+ new ClientHandler(this, socket);
+ }
+ } catch (IOException e) {
+ System.err.println("Запрашиваемый порт занят");
+ } catch (ClassNotFoundException | SQLException e) {
+ System.out.println("Не удалось запустить сервис авторизации");
+ } finally {
+ authService.disconnect();
+ }
+ }
+
+ public void subscribe(ClientHandler clientHandler) {
+ clientList.add(clientHandler);
+ broadcastClientListSender();
+ }
+
+ public void unsubscribe(ClientHandler clientHandler) {
+ clientList.remove(clientHandler);
+ broadcastClientListSender();
+ }
+
+ public boolean isNickBusy(String nick) {
+ for (ClientHandler ch : clientList)
+ if (ch.getNick().equals(nick)) return true;
+
+ return false;
+ }
+
+ public void broadcastSender(String message) {
+ for (ClientHandler ch :
+ clientList) {
+ ch.sendMessage(message);
+ }
+ }
+
+ public void privateSender(ClientHandler sender, String destNnick, String message) {
+ for (ClientHandler ch :
+ clientList) {
+ if (destNnick.equals(ch.getNick())) {
+ ch.sendMessage(sender.getNick() + " private: " + message);
+ sender.sendMessage("private to " + destNnick + ": " + message);
+ return;
+ }
+ }
+ sender.sendMessage("клиент с ником " + destNnick + " не найден");
+ }
+
+ private void broadcastClientListSender() {
+ StringBuilder sb = new StringBuilder("/clients ");
+ for (ClientHandler ch :
+ clientList) {
+ sb.append(ch.getNick()).append(" ");
+ }
+ String clientsListMsg = sb.toString();
+ for (ClientHandler ch :
+ clientList) {
+ ch.sendMessage(clientsListMsg);
+ }
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/ServerMain.java b/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/ServerMain.java
new file mode 100644
index 0000000..3aa2580
--- /dev/null
+++ b/src/ru/geekbrains/java2/lesson_07/javaFXChat/server/ServerMain.java
@@ -0,0 +1,7 @@
+package ru.geekbrains.java2.lesson_07.javaFXChat.server;
+
+public class ServerMain {
+ public static void main(String[] args) {
+ new Server(8189);
+ }
+}
diff --git a/src/ru/geekbrains/java2/lesson_07/javaFXChat/sqlite-jdbc-3.21.0.jar b/src/ru/geekbrains/java2/lesson_07/javaFXChat/sqlite-jdbc-3.21.0.jar
new file mode 100644
index 0000000..56b627d
Binary files /dev/null and b/src/ru/geekbrains/java2/lesson_07/javaFXChat/sqlite-jdbc-3.21.0.jar differ