commit
This commit is contained in:
95
java/client/src/socket/client/ClientApp.java
Normal file
95
java/client/src/socket/client/ClientApp.java
Normal file
@@ -0,0 +1,95 @@
|
||||
package socket.client;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.Socket;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class ClientApp {
|
||||
private static Socket client;
|
||||
private static Thread inThread;
|
||||
private static Thread outThread;
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
client = new Socket("127.0.0.1", 8888);
|
||||
inThread = new Thread(ClientApp::inputHandle);
|
||||
outThread = new Thread(ClientApp::outputHandle);
|
||||
|
||||
inThread.start();
|
||||
outThread.start();
|
||||
|
||||
try {
|
||||
inThread.join();
|
||||
outThread.join();
|
||||
} catch (InterruptedException e) {
|
||||
closeConnect();
|
||||
}
|
||||
}
|
||||
|
||||
private static void inputHandle() {
|
||||
BufferedReader in;
|
||||
try {
|
||||
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
closeConnect();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
while (!client.isClosed() || !Thread.currentThread().isInterrupted()) {
|
||||
String message = in.readLine();
|
||||
if (message != null) {
|
||||
System.out.printf("INCOMMING MESSAGE: %s\n", message);
|
||||
}
|
||||
|
||||
try {
|
||||
TimeUnit.SECONDS.sleep(1);
|
||||
} catch (InterruptedException e) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
closeConnect();
|
||||
}
|
||||
}
|
||||
|
||||
private static void outputHandle() {
|
||||
BufferedWriter out;
|
||||
try {
|
||||
out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
closeConnect();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
while (!client.isClosed() || !Thread.currentThread().isInterrupted()) {
|
||||
String pingJson = String.format("{\"ping\": %d}\n", System.currentTimeMillis());
|
||||
out.write(pingJson);
|
||||
out.flush();
|
||||
|
||||
try {
|
||||
TimeUnit.SECONDS.sleep(1);
|
||||
} catch (InterruptedException e) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
closeConnect();
|
||||
}
|
||||
}
|
||||
|
||||
private static void closeConnect() {
|
||||
inThread.interrupt();
|
||||
outThread.interrupt();
|
||||
|
||||
try {
|
||||
client.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
118
java/server/src/socket/server/ServerApp.java
Normal file
118
java/server/src/socket/server/ServerApp.java
Normal file
@@ -0,0 +1,118 @@
|
||||
package socket.server;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.InetAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class ServerApp {
|
||||
private static final List<ClientHandler> clients = new CopyOnWriteArrayList<>();
|
||||
|
||||
@SuppressWarnings("InfiniteLoopStatement")
|
||||
public static void main(String[] args) throws IOException {
|
||||
ServerSocket server = new ServerSocket(8888, 50, InetAddress.getByName("localhost"));
|
||||
server.setSoTimeout(5 * 1000);
|
||||
|
||||
while (true) {
|
||||
System.out.println("[i] wait client...");
|
||||
Socket client;
|
||||
try {
|
||||
client = server.accept();
|
||||
} catch (SocketTimeoutException e) {
|
||||
continue;
|
||||
}
|
||||
|
||||
clients.add(new ClientHandler(client));
|
||||
System.out.printf("[i] client connected (%d/50).\n", clients.size());
|
||||
}
|
||||
}
|
||||
|
||||
public static class ClientHandler {
|
||||
private final Socket client;
|
||||
private final Thread inThread;
|
||||
private final Thread outThread;
|
||||
|
||||
public ClientHandler(Socket client) {
|
||||
this.client = client;
|
||||
this.inThread = new Thread(this::inputHandle);
|
||||
this.outThread = new Thread(this::outputHandle);
|
||||
|
||||
this.inThread.start();
|
||||
this.outThread.start();
|
||||
}
|
||||
|
||||
private void inputHandle() {
|
||||
BufferedReader in;
|
||||
try {
|
||||
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
||||
} catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
closeConnect();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
while (!client.isClosed() || !Thread.currentThread().isInterrupted()) {
|
||||
String message = in.readLine();
|
||||
if (message != null) {
|
||||
System.out.printf("INCOMMING MESSAGE: %s\n", message);
|
||||
}
|
||||
|
||||
try {
|
||||
TimeUnit.SECONDS.sleep(1);
|
||||
} catch (InterruptedException e) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
closeConnect();
|
||||
}
|
||||
}
|
||||
|
||||
private void outputHandle() {
|
||||
BufferedWriter out;
|
||||
try {
|
||||
out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
|
||||
} catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
closeConnect();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
while (!client.isClosed() || !Thread.currentThread().isInterrupted()) {
|
||||
String pingJson = String.format("{\"ping\": %d}\n", System.currentTimeMillis());
|
||||
out.write(pingJson);
|
||||
out.flush();
|
||||
|
||||
try {
|
||||
TimeUnit.SECONDS.sleep(1);
|
||||
} catch (InterruptedException e) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
closeConnect();
|
||||
}
|
||||
}
|
||||
|
||||
private void closeConnect() {
|
||||
this.inThread.interrupt();
|
||||
this.outThread.interrupt();
|
||||
|
||||
try {
|
||||
client.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
clients.remove(this);
|
||||
System.out.printf("[i] client close connection (%d/50)\n", clients.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user