Я учусь разрабатывать сервер и клиент с java 14. Я также изучаю ssl и использую sslsocketfactory.
Я запускаю это приложение на linux, если это имеет значение.
Сначала я сгенерировал хранилище ключей для ssl с помощью следующей команды:
Keytool -genkey -alias my.game -keyalg rsa -keysize 2048 -keystore game.jks (и я установил пароль. )
затем я запускаю свой сервер и клиент так:
сервер:
Java GameServer -Djavax. net .ssl.keyStore = game.jks - Djavax. net .ssl.keyStorePassword = passwd38883 -Djavax. net .debug = все
клиент:
Java Клиент -Djavax. net .ssl.trustStore = gortsstore.jks -Djavax. net .ssl.trustStorePassword = passwd38883 -Djavax. net .debug = all
ниже приведен код сервера, он состоит из двух классов: я не уверен, что я сделал полностью прав, но я действительно пытаюсь модулировать мой код.
Сервер. java:
package com.domain.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.domain.net.SecuredSocket;
public class Server {
public int limit = 0;
public int uptime = 0;
private String server_name = "Default Base Server";
private SecuredSocket secSoc;
private PrintWriter writer;
private BufferedReader reader;
ServerSocket serverSocket;
Socket socket;
// this will maintain the connection nodes.
private static HashSet<String> names = new HashSet<String>();
// the set of print writers.
private static HashSet<PrintWriter> writers = new HashSet<PrintWriter>();
private static HashSet<BufferedReader> readers = new HashSet<BufferedReader>();
public Server() {
super();
this.server_name = "Galaxy 1, Milky Way";
this.secSoc = new SecuredSocket(8888);
this.reader = secSoc.getInputStream();
this.writer = secSoc.getOutputStream();
} // end default constructor.
public void startup() {
String user_name = "";
while ( true ) {
writer.println("Welcome to server: "+this.getServerName());
writer.println("Please Enter a name: ");
try {
user_name = reader.readLine();
System.out.println("Client entered: "+user_name);
} catch (IOException ex) {
Logger.getLogger(Server.class.getName())
.log(Level.SEVERE, null, ex);
}
writer.println("You have connected as: "+user_name);
}
}
public String getServerName() {
return this.server_name;
}
public void setServerName(String name) {
this.server_name = name;
}
} // end class
SecureSocket. java - это то, где я вижу tup ssl socket factory et c.
package com.domain.net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLServerSocketFactory;
public class SecuredSocket{
int port = 0;
private SSLServerSocketFactory sslServerSocketFactory;
private ServerSocket serverSocket;
private Socket socket;
private PrintWriter out;
private BufferedReader reader;
public SecuredSocket(int p){
this.port = p; // the passed through server port from the server class.
sslServerSocketFactory = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
try {
serverSocket =
sslServerSocketFactory.createServerSocket(port);
System.out.println("SSL ServerSocket started on port: "+port);
System.out.println(serverSocket.toString());
socket = serverSocket.accept();
System.out.println("ServerSocket accepted");
out = new PrintWriter(socket.getOutputStream(), true);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException ex) {
Logger.getLogger(SecuredSocket.class.getName())
.log(Level.SEVERE, null, ex);
}
} // end constructor
public ServerSocket getSSLServerSocket() {
return this.serverSocket;
}
public PrintWriter getOutputStream() {
return this.out;
}
public BufferedReader getInputStream() {
return this.reader;
}
} // end class
точка входа сервера, которая имеет main (), находится ниже:
SSLServer. java:
import com.domain.server.*;
public class SSLServer {
public static void main(String[] args) {
Server srv = new Server();
System.out.println("Initializing server: " + srv.getServerName());
srv.startup();
}
} // end class
and my small test client:
TestClient.java:
package com.domain.clientt;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLSocketFactory;
public class TestClient {
static final int port = 8888;
public static void main(String[] args) {
SSLSocketFactory sslSocketFactory =
(SSLSocketFactory)SSLSocketFactory.getDefault();
try {
Socket socket = sslSocketFactory.createSocket("localhost", port);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
try (BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(socket.getInputStream()))) {
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("Enter something:");
String inputLine = scanner.nextLine();
if(inputLine.equals("q")){
break;
}
out.println(inputLine);
System.out.println(bufferedReader.readLine());
}
}
} catch (IOException ex) {
Logger.getLogger(TestClient.class.getName())
.log(Level.SEVERE, null, ex);
}
}
}
когда я запускаю эту настройку сервера / клиента, когда в клиенте он возвращает мне просто ноль, а не просто повторяет мне то, что я сказал.
также, на стороне сервера он говорит "клиент вошел: ноль" "снова и снова.
Любая помощь будет принята с благодарностью.
Заранее извиняюсь за плохое форматирование поста или кода, я абсолютно слепой и использую программу для чтения с экрана. Так что иногда это трудно.
Спасибо.