Я прочитал много вопросов / ответов по программированию сокетов Java, но ни один из них не относится к моей текущей проблеме.
Я написал базовую программу сокетов Java Java, единственное предназначение которой (длямомент) - установить 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");
}