Я прочитал много вопросов/ответов по программированию сокетов Java, но ни один из них не относится к моей текущей проблеме.
Я написал базовую программу сокетов java ssl, единственной целью которой (на данный момент) является установление ssl-соединения между клиентом и сервером и отправка клиентом одного подписанного сообщения. Если сообщение проверяется сервером, он должен ответить соответственно (true!) или иначе (false!).
Я застреваю после этапа рукопожатия, когда клиент отправляет «сообщение» на сервер и ждет ответа сервера. Тем временем сервер не обрабатывает сообщение, отправленное клиентом, поэтому он не может ответить, и я жду, когда кто-либо из них закончит с этим.
Можете ли вы сказать мне, где я сделал ошибку?
Чтобы не отображать огромное количество нерелевантного кода, я не включил ни объект значения SignedMessage, ни класс Utils. Методы, используемые в классе utils, предназначены для сериализации и десериализации, а также для преобразования строки в массив байтов. Я знаю, что мог бы использовать String.getBytes(), но мне нравилось выполнять преобразование вручную. Все перечисленные методы проверены и работают нормально.
код метода запуска ServerThread
public void run() {
try {
InputStream in = sslSocket.getInputStream();
OutputStream out = sslSocket.getOutputStream();
//if I write some output here the program works well, but this is not what I want to do
//out.write('!');
//BASE64 DECODING
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int ch;
while((ch = in.read()) != -1)
bos.write(ch);
ByteArrayOutputStream decoded = new ByteArrayOutputStream();
Base64Encoder encoder = new Base64Encoder();
encoder.decode(bos.toByteArray(), 0, bos.toByteArray().length, decoded);
//reconstructing the the SignedMessage object
SignedMessage signedMessage = (SignedMessage) Utils.deserializeObject(decoded.toByteArray());
if(checkSignature(signedMessage.getMessage().getBytes("UTF-8"), signedMessage.getSignature(), signedMessage.getCertificate())){
System.out.println(String.valueOf(signedMessage.getMessage()));
//this i where I would like to write out the answer, but the code never get executed
out.write(Utils.toByteArray("TRUE!"));
out.flush();
}
else {
out.write(Utils.toByteArray("false!"));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
sslSocket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
System.out.println("Thread closed");
}
Это код клиента, который осуществляет связь
static void doProtocol(SSLSocket sslSocket) throws IOException, UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException {
OutputStream out = sslSocket.getOutputStream();
InputStream in = sslSocket.getInputStream();
byte[] signature = generateSignature(Utils.toByteArray(Message), (PrivateKey) clientStore.getKey(Utils.CLIENT_NAME, Utils.CLIENT_PASSWORD),
clientStore.getCertificate(Utils.CLIENT_NAME).getPublicKey().getAlgorithm());
//BASE64 ENCODING
byte[] object = Utils.serializeObject(new SignedMessage(Message, signature, clientStore.getCertificate(Utils.CLIENT_NAME)));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Base64Encoder encoder = new Base64Encoder();
encoder.encode(object, 0, object.length, bos);
out.write(bos.toByteArray());
out.flush();
int ch;
while((ch = in.read()) != '!')
bos.write(ch);
System.out.println("Sesion closed");
}