esoe
2 years ago
commit
efd2b85933
3 changed files with 244 additions and 0 deletions
@ -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> |
@ -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); |
||||||
|
} |
||||||
|
} |
@ -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…
Reference in new issue