Skip to content

Commit

Permalink
Selector + SocketChannel realization
Browse files Browse the repository at this point in the history
  • Loading branch information
vlasival committed Jun 3, 2024
1 parent c46ffda commit b6910c8
Show file tree
Hide file tree
Showing 15 changed files with 363 additions and 405 deletions.
6 changes: 6 additions & 0 deletions task_2_1_2/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ dependencies {

// This dependency is used by the application.
implementation libs.guava

compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'

testCompileOnly 'org.projectlombok:lombok:1.18.32'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.32'
}

// Apply a specific Java toolchain to ease working on different environments.
Expand Down
56 changes: 0 additions & 56 deletions task_2_1_2/app/src/main/java/org/prime/Broadcaster.java

This file was deleted.

36 changes: 0 additions & 36 deletions task_2_1_2/app/src/main/java/org/prime/Checker.java

This file was deleted.

16 changes: 0 additions & 16 deletions task_2_1_2/app/src/main/java/org/prime/Main.java

This file was deleted.

89 changes: 0 additions & 89 deletions task_2_1_2/app/src/main/java/org/prime/Master.java

This file was deleted.

20 changes: 6 additions & 14 deletions task_2_1_2/app/src/main/java/org/prime/Message.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,12 @@
package org.prime;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

class Message implements Serializable {
private ArrayList<Integer> numbers;
import lombok.Data;

Check warning on line 6 in task_2_1_2/app/src/main/java/org/prime/Message.java

View workflow job for this annotation

GitHub Actions / checkstyle

[reviewdog] reported by reviewdog 🐶 Extra separation in import group before 'lombok.Data' Raw Output: /github/workspace/./task_2_1_2/app/src/main/java/org/prime/Message.java:6:1: warning: Extra separation in import group before 'lombok.Data' (com.puppycrawl.tools.checkstyle.checks.imports.CustomImportOrderCheck)

public Message(int count) {
numbers = new ArrayList<>();
final int prime = 1000000007;
for (int i = 0; i < count; i++) {
numbers.add(prime);
}
}

public ArrayList<Integer> getNumbers() {
return numbers;
}
@Data

Check warning on line 8 in task_2_1_2/app/src/main/java/org/prime/Message.java

View workflow job for this annotation

GitHub Actions / checkstyle

[reviewdog] reported by reviewdog 🐶 Missing a Javadoc comment. Raw Output: /github/workspace/./task_2_1_2/app/src/main/java/org/prime/Message.java:8:1: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocTypeCheck)
public class Message implements Serializable {
private String type;
private List<Integer> data;
}
38 changes: 0 additions & 38 deletions task_2_1_2/app/src/main/java/org/prime/NodeTester.java

This file was deleted.

117 changes: 117 additions & 0 deletions task_2_1_2/app/src/main/java/org/prime/PrimeClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package org.prime;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;

public class PrimeClient {

Check warning on line 14 in task_2_1_2/app/src/main/java/org/prime/PrimeClient.java

View workflow job for this annotation

GitHub Actions / checkstyle

[reviewdog] reported by reviewdog 🐶 Missing a Javadoc comment. Raw Output: /github/workspace/./task_2_1_2/app/src/main/java/org/prime/PrimeClient.java:14:1: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocTypeCheck)
private SocketChannel socket;
private ByteBuffer buffer;

public PrimeClient(String address, int port) throws IOException {

Check warning on line 18 in task_2_1_2/app/src/main/java/org/prime/PrimeClient.java

View workflow job for this annotation

GitHub Actions / checkstyle

[reviewdog] reported by reviewdog 🐶 Missing a Javadoc comment. Raw Output: /github/workspace/./task_2_1_2/app/src/main/java/org/prime/PrimeClient.java:18:5: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck)
socket = SocketChannel.open(new InetSocketAddress(address, port));
System.out.println("Chanell binded on ip " + address + " on port " + port);
socket.configureBlocking(false);
System.out.println("Chanell configured");
buffer = ByteBuffer.allocate(256);
}

public void start() throws IOException {

Check warning on line 26 in task_2_1_2/app/src/main/java/org/prime/PrimeClient.java

View workflow job for this annotation

GitHub Actions / checkstyle

[reviewdog] reported by reviewdog 🐶 Missing a Javadoc comment. Raw Output: /github/workspace/./task_2_1_2/app/src/main/java/org/prime/PrimeClient.java:26:5: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck)
// ready to work notification to server
sendMessage(createMessage("REQUEST", null));

int requestAttempts = 0;

while (true) {
buffer.clear();
int bytesRead = socket.read(buffer);
if (bytesRead == -1) {
System.out.println("Server is down. Shutting down...");
return;
}
if (bytesRead > 0) {
buffer.flip();
try {
Message message = readMessageFromBuffer();
String messageType = message.getType();
switch (messageType) {
case "TASK":
handleTask(message.getData());
requestAttempts = 0;
break;
case "EXIT":
System.out.println("Tasks done. Exiting program...");
return;
default:
System.out.println("Unknown message type. Syncronize types with server");

Check warning on line 53 in task_2_1_2/app/src/main/java/org/prime/PrimeClient.java

View workflow job for this annotation

GitHub Actions / checkstyle

[reviewdog] reported by reviewdog 🐶 Line is longer than 100 characters (found 101). Raw Output: /github/workspace/./task_2_1_2/app/src/main/java/org/prime/PrimeClient.java:53:0: warning: Line is longer than 100 characters (found 101). (com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck)
break;
}
} catch (ClassNotFoundException e) {
if (requestAttempts >= 3) {
System.out.println("Too many attempts to receive message. Aborting...");
return;
}
System.out.println("Error to cast received message from server to Message class.");

Check warning on line 61 in task_2_1_2/app/src/main/java/org/prime/PrimeClient.java

View workflow job for this annotation

GitHub Actions / checkstyle

[reviewdog] reported by reviewdog 🐶 Line is longer than 100 characters (found 103). Raw Output: /github/workspace/./task_2_1_2/app/src/main/java/org/prime/PrimeClient.java:61:0: warning: Line is longer than 100 characters (found 103). (com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck)
System.out.println("Requesting task.");
sendMessage(createMessage("REQUEST", null));
requestAttempts++;
}
buffer.clear();
}
}
}

private void handleTask(List<Integer> nums) throws IOException {
for (Integer number : nums) {
if (!isPrime(number)) {
sendMessage(createMessage("RESULT", null));
return;
}
}
sendMessage(createMessage("RESULT", new ArrayList<>()));
}

private boolean isPrime(int number) {
if (number <= 1) return false;
for (int i = 2; i <= Math.sqrt(number); i++) {
if (number % i == 0) return false;
}
return true;
}

private Message createMessage(String type, List<Integer> data) {
Message message = new Message();
message.setType(type);
message.setData(data);
return message;
}

private Message readMessageFromBuffer() throws IOException, ClassNotFoundException {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer.array());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
Message message = (Message) objectInputStream.readObject();
return message;
}

private void sendMessage(Message message) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(message);
objectOutputStream.flush();
byte[] data = byteArrayOutputStream.toByteArray();
ByteBuffer buffer = ByteBuffer.wrap(data);
socket.write(buffer);
}

public static void main(String[] args) throws IOException {
PrimeClient client = new PrimeClient("localhost", 5000);
client.start();
}
}
Loading

0 comments on commit b6910c8

Please sign in to comment.