commit efd2b85933554c50eced9e84601b37a3269fd1e6 Author: esoe Date: Sat Sep 17 12:28:56 2022 +0300 ready diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..241659c --- /dev/null +++ b/pom.xml @@ -0,0 +1,75 @@ + + + + 4.0.0 + + ru.molokoin + chat-client + 0.1 + + chat-client + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/src/main/java/ru/molokoin/Client.java b/src/main/java/ru/molokoin/Client.java new file mode 100644 index 0000000..b8d9fab --- /dev/null +++ b/src/main/java/ru/molokoin/Client.java @@ -0,0 +1,149 @@ +package ru.molokoin; +import java.net.*; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * создание клиента со всеми необходимыми утилитами, точка входа в программу в классе Client + */ + +class ClientSomthing { + + private Socket socket; + private BufferedReader in; // поток чтения из сокета + private BufferedWriter out; // поток чтения в сокет + private BufferedReader inputUser; // поток чтения с консоли + private String addr; // ip адрес клиента + private int port; // порт соединения + private String nickname; // имя клиента + private Date time; + private String dtime; + private SimpleDateFormat dt1; + + /** + * для создания необходимо принять адрес и номер порта + * + * @param addr + * @param port + */ + + public ClientSomthing(String addr, int port) { + this.addr = addr; + this.port = port; + try { + this.socket = new Socket(addr, port); + } catch (IOException e) { + System.err.println("Socket failed"); + } + try { + // потоки чтения из сокета / записи в сокет, и чтения с консоли + inputUser = new BufferedReader(new InputStreamReader(System.in)); + in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); + this.pressNickname(); // перед началом необходимо спросит имя + new ReadMsg().start(); // нить читающая сообщения из сокета в бесконечном цикле + new WriteMsg().start(); // нить пишущая сообщения в сокет приходящие с консоли в бесконечном цикле + } catch (IOException e) { + // Сокет должен быть закрыт при любой + // ошибке, кроме ошибки конструктора сокета: + ClientSomthing.this.downService(); + } + // В противном случае сокет будет закрыт + // в методе run() нити. + } + + /** + * просьба ввести имя, + * и отсылка эхо с приветсвием на сервер + */ + + private void pressNickname() { + System.out.print("Press your nick: "); + try { + nickname = inputUser.readLine(); + out.write("Hello " + nickname + "\n"); + out.flush(); + } catch (IOException ignored) { + } + + } + + /** + * закрытие сокета + */ + private void downService() { + try { + if (!socket.isClosed()) { + socket.close(); + in.close(); + out.close(); + } + } catch (IOException ignored) {} + } + + // нить чтения сообщений с сервера + private class ReadMsg extends Thread { + @Override + public void run() { + + String str; + try { + while (true) { + str = in.readLine(); // ждем сообщения с сервера + if (str.equals("stop")) { + ClientSomthing.this.downService(); // харакири + break; // выходим из цикла если пришло "stop" + } + System.out.println(str); // пишем сообщение с сервера на консоль + } + } catch (IOException e) { + ClientSomthing.this.downService(); + } + } + } + + // нить отправляющая сообщения приходящие с консоли на сервер + public class WriteMsg extends Thread { + + @Override + public void run() { + while (true) { + String userWord; + try { + time = new Date(); // текущая дата + dt1 = new SimpleDateFormat("HH:mm:ss"); // берем только время до секунд + dtime = dt1.format(time); // время + userWord = inputUser.readLine(); // сообщения с консоли + if (userWord.equals("stop")) { + out.write("stop" + "\n"); + ClientSomthing.this.downService(); // харакири + break; // выходим из цикла если пришло "stop" + } else { + out.write("(" + dtime + ") " + nickname + ": " + userWord + "\n"); // отправляем на сервер + } + out.flush(); // чистим + } catch (IOException e) { + ClientSomthing.this.downService(); // в случае исключения тоже харакири + + } + + } + } + } +} + +public class Client { + + public static String ipAddr = "localhost"; + public static int port = 8080; + + /** + * создание клиент-соединения с узананными адресом и номером порта + * @param args + */ + + public static void main(String[] args) { + new ClientSomthing(ipAddr, port); + } +} \ No newline at end of file diff --git a/src/test/java/ru/molokoin/AppTest.java b/src/test/java/ru/molokoin/AppTest.java new file mode 100644 index 0000000..fbee865 --- /dev/null +++ b/src/test/java/ru/molokoin/AppTest.java @@ -0,0 +1,20 @@ +package ru.molokoin; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +}