Browse Source

ready

master
esoe 2 years ago
commit
efd2b85933
  1. 75
      pom.xml
  2. 149
      src/main/java/ru/molokoin/Client.java
  3. 20
      src/test/java/ru/molokoin/AppTest.java

75
pom.xml

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.molokoin</groupId>
<artifactId>chat-client</artifactId>
<version>0.1</version>
<name>chat-client</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

149
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);
}
}

20
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 );
}
}
Loading…
Cancel
Save