forked from adelaidekangaroo/Talk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathClient.java
More file actions
148 lines (129 loc) · 5.76 KB
/
Client.java
File metadata and controls
148 lines (129 loc) · 5.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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);
}
}