Не получается просто считывать данные в Java SSL Socket сервере

программирование java C# SSL sockets

Пытаюсь написать сервер - клиент. Столкнулся с проблемой, что не получается корректно считывать данные из потока. Только вручную. Можно ли как-то улучшить считывание?

public static void main(String[] args) throws Exception {
System.out.println("Opening server socket...");
System.out.println(System.currentTimeMillis());
char[] passphrase = "password".toCharArray();
System.out.println"---------------------");
System.out.println(java.security.KeyStore.getDefaultType());
try
{
KeyStore keystore1 = KeyStore.getInstance("jks");
FileInputStream fis = new FileInputStream("mykeystore.jks");
keystore1.load(fis, passphrase);
fis.close();
KeyStore ksTrust = KeyStore.getInstance("jks");
FileInputStream fis2 = new FileInputStream("mykeystore.jks");
ksTrust.load(fis2, passphrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keystore1, passphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ksTrust);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null);

SSLServerSocketFactory ssf =
(SSLServerSocketFactory) sslContext.getServerSocketFactory();
SSLServerSocket ss =
(SSLServerSocket) ssf.createServerSocket(PORT_WORK);

while (true) {
SSLSocket s = (SSLSocket) ss.accept();
s.startHandshake();
s.setTcpNoDelay(true);
//* Эта часть работает только вручную
byte[]b = new byte[2048];
s.getInputStream().read(b);
System.out.println(new String(b).trim());

s.getOutputStream().write("Test".getBytes("UTF-8"));

b = new byte[2048];
s.getInputStream().read(b);
System.out.println(new String(b).trim());
//* Но почему?

s.close();
System.out.println("-------||END||-------");
}
} catch (Exception e) {
System.out.println("Cannot open\r\n" + e);
}
}

Клиент C#

public static bool ValidateServerCertificate(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors != SslPolicyErrors.None)
Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
return true;
}

static void Main(string[] args)
{
TcpClient client = new TcpClient() { SendTimeout = 1000, ReceiveTimeout = 1000 };
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4446);

client.Connect(serverEndPoint);
client.NoDelay = true;
Console.WriteLine("Client connected.");

SslStream sslStream = new SslStream(client.GetStream(),
false,ValidateServerCertificate, null);
try
{
sslStream.AuthenticateAsClient("Test");
try
{
Console.WriteLine("---------------------");
char[] c = new char[2048];
StreamReader sr = new StreamReader(sslStream);
StreamWriter sw = new StreamWriter(sslStream);
sw.WriteLine("Hardly one"); sw.Flush();
Console.WriteLine(new string(c, 0, sr.Read(c, 0, c.Length)));
sw.WriteLine("Simple two"); sw.Flush();
}
catch (Exception e){Console.WriteLine(e.Message);}
}
catch (Exception error)
{
Console.WriteLine("Exception: {0}", error.Message);
if (error.InnerException != null)
{
Console.WriteLine("Inner exception: {0}", error.InnerException.Message);
}
Console.WriteLine("Authentication failed - closing the connection.");
}
client.Close();
Console.WriteLine("---------------------");
Console.WriteLine("Client disconnected.");
Console.ReadKey();
}

Примечание:
___________________
Под ручным вводом я подразумевал что на серверной части приходилось считывать из потока побайтно. "Корректно" легко и просто сразу построчно считывать и записывать. Раньше использовалась такая связка:
InputStream sin = clientSocket.getInputStream();
OutputStream sout = clientSocket.getOutputStream();
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);
Ответы:
что значит "корректно считывать данные из потока" и в особенности "считывать вручную?"


10 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.