import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.security.Key;
public class TCPServer {
private static final int PORT = 8888;
private static final String ALGORITHM = "DES";
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Server started, waiting for client to connect...");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("Client connected: " + socket.getInetAddress());
Thread thread = new Thread(new Handler(socket));
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class Handler implements Runnable {
private final Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
SecretKey secretKey = generateSecretKey();
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
byte[] decryptedBytes = cipher.doFinal(buffer, 0, length);
String message = new String(decryptedBytes, StandardCharsets.UTF_8);
System.out.println("[Receive]: " + message);
if ("exit".equals(message.trim())) {
break;
}
}
inputStream.close();
outputStream.close();
socket.close();
System.out.println("Client disconnected: " + socket.getInetAddress());
} catch (Exception e) {
e.printStackTrace();
}
}
private SecretKey generateSecretKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(56);
return keyGenerator.generateKey();
}
}
}