jnetperf/src/main/java/biz/nellemann/jnetperf/TcpServer.java

101 lines
2.5 KiB
Java
Raw Normal View History

2023-07-13 19:59:38 +00:00
package biz.nellemann.jnetperf;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer extends Thread {
final Logger log = LoggerFactory.getLogger(TcpServer.class);
private final int port;
2023-07-13 19:59:38 +00:00
private ServerSocket socket;
private DataInputStream in;
private DataOutputStream out;
private byte[] inBuffer;
public TcpServer(int port) throws IOException {
log.info("TcpServer()");
this.port = port;
2023-07-13 19:59:38 +00:00
}
public void run() {
try {
while (true) {
socket = new ServerSocket(port);
socket.setSoTimeout(0); // Wait indefinitely
2023-07-14 05:40:34 +00:00
inBuffer = new byte[Payload.DEFAULT_LENGTH];
2023-07-13 19:59:38 +00:00
session();
socket.close();
2023-07-13 19:59:38 +00:00
}
} catch(IOException e) {
log.error(e.getMessage());
}
}
public void session() throws IOException {
Statistics statistics = new Statistics();
boolean running = true;
boolean ackEnd = false;
Socket server = socket.accept();
InetAddress address = socket.getInetAddress();
in = new DataInputStream(server.getInputStream());
out = new DataOutputStream(server.getOutputStream());
while (running) {
2023-07-14 05:40:34 +00:00
Payload payload = receive();
2023-07-13 19:59:38 +00:00
statistics.transferPacket();
2023-07-14 05:40:34 +00:00
statistics.transferBytes(payload.getLength());
2023-07-13 19:59:38 +00:00
2023-07-14 05:40:34 +00:00
if(payload.getType() == PayloadType.HANDSHAKE.getValue()) {
2023-07-13 19:59:38 +00:00
log.info("Handshake from ... {}", address);
// Setup to receive larger datagrams
2023-07-14 05:40:34 +00:00
inBuffer = new byte[payload.getLength()];
2023-07-13 19:59:38 +00:00
statistics.reset();
}
2023-07-14 05:40:34 +00:00
if(payload.getType() == PayloadType.END.getValue()) {
2023-07-13 19:59:38 +00:00
ackEnd = true;
}
// Send ACK
2023-07-14 05:40:34 +00:00
Payload responsePayload = new Payload(PayloadType.ACK.getValue(), Payload.DEFAULT_LENGTH, payload.getCurPkt(), 1);
out.write(responsePayload.getPayload());
2023-07-13 19:59:38 +00:00
statistics.ack();
statistics.tick();
2023-07-14 05:40:34 +00:00
if(ackEnd) {
2023-07-13 19:59:38 +00:00
running = false;
statistics.printAverage();
statistics.printSummary();
}
}
in.close();
out.close();
server.close();
}
2023-07-14 05:40:34 +00:00
private Payload receive() throws IOException {
2023-07-13 19:59:38 +00:00
in.readFully(inBuffer);
return new Payload(inBuffer);
2023-07-13 19:59:38 +00:00
}
}