Java DataOutputStream.write()无法正常工作,但DataOutputStream.writeUTF()无法正常工作

Java DataOutputStream.write()无法正常工作,但DataOutputStream.writeUTF()无法正常工作,java,ssl,server,client,Java,Ssl,Server,Client,我有一个客户机/服务器对,其中有一个消息传递应用程序,我正试图向其中添加SSL支持。客户端/服务器通常使用DataInputStream和DataOutputStream发送/接收它们的信息,使用字节数组(DataOutputStream.write(字节[])和DataInputStream.readFully(字节[]))。但由于某些原因,这不适用于SSL套接字。我尝试过使用DataOutputStream.writeUTF()和DataInputStream.readUTF(),效果很好。

我有一个客户机/服务器对,其中有一个消息传递应用程序,我正试图向其中添加SSL支持。客户端/服务器通常使用DataInputStream和DataOutputStream发送/接收它们的信息,使用字节数组(DataOutputStream.write(字节[])和DataInputStream.readFully(字节[]))。但由于某些原因,这不适用于SSL套接字。我尝试过使用DataOutputStream.writeUTF()和DataInputStream.readUTF(),效果很好。我甚至尝试使用其他类型的读写器,比如BufferedReader/BufferedWriter,它们都可以工作,但当我尝试使用字节时,它不会发送任何内容。更奇怪的是,在检查两侧的DataOutputStream.size()之后,它们都打印出它们已经发送了数据

服务器端:

logger.info("Waiting to accept a new client socket");
clientSocket = (SSLSocket) serverSocket.accept();

logger.info("Socket accepted successfully");
DataOutputStream dataOutputStream=newDataOutputStream(clientSocket.getOutputStream());
DataInputStream dataInputStream=new DataInputStream(clientSocket.getInputStream());

logger.trace("Socket is going to read");

int data=dataInputStream.available();
byte[] message=new byte[data];

dataInputStream.readFully(message);
logger.trace("Message received: {}",message);

logger.trace("Gonna respond");
if(message.length>0){
    dataOutputStream.write(message,0,message.length);
}else{
    String response=new String("wot?".getBytes(),"ASCII");
    dataOutputStream.write(response.getBytes(),0,response.getBytes().length);
}
dataOutputStream.flush();

logger.trace("Chars written: {}",dataOutputStream.size());
客户端:

SSLSocketFactory sslsocketfactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
logger.trace("SSL Socket factory created");
javax.net.ssl.SSLSocket sslSocket = (javax.net.ssl.SSLSocket)sslsocketfactory.createSocket(url, port);
logger.trace("SSL Socket created");
sslSocket.setSoTimeout(6000);

outputStream = sslSocket.getOutputStream();
inputStream=sslSocket.getInputStream();

DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
DataInputStream dataInputStream=new DataInputStream(inputStream);
logger.trace("Input and output created");

//dataOutputStream.writeBytes(frame);
//dataOutputStream.writeUTF(frame);

dataOutputStream.write(frame.getBytes(),0,frame.getBytes().length);

dataOutputStream.flush();
logger.trace("Frame {} sent",frame);
logger.trace("Bytes sent: {}",dataOutputStream.size());

int data=dataInputStream.available();
byte[] messageRead = new byte[data];
dataInputStream.readFully(messageRead);

任何帮助都将不胜感激。我一直在四处寻找,不知道还能尝试什么。

误用了
available()
,并且TCP支持消息的假设无效。我建议您对所有内容使用
readUTF()
writeUTF()
,而不是所有这些代码,或者使用
BufferedReader读写行。
首先,感谢您的回复!其次,TCP必须支持消息(顺便说一句,我们使用的是ISO8583协议),因为我们已经有一些带有测试响应的功能消息。当我们尝试将SSL实现到现有的SSL时,问题就出现了。我们不能使用
readUTF()
writeUTF
,因为它显然没有按照需要正常工作。为了详细说明EJP的观点,特别声明“使用此方法的返回值来分配一个缓冲区来保存此流中的所有数据永远是不正确的。”,该方法应命名为
availableWithoutBlocking()
。误用
available()
,并且TCP支持消息的假设无效。我建议您对所有内容使用
readUTF()
writeUTF()
,而不是所有这些代码,或者使用
BufferedReader读写行。
首先,感谢您的回复!其次,TCP必须支持消息(顺便说一句,我们使用的是ISO8583协议),因为我们已经有一些带有测试响应的功能消息。当我们尝试将SSL实现到现有的SSL时,问题就出现了。我们不能使用
readUTF()
writeUTF
,因为它显然没有按照需要正常工作。为了详细说明EJP的观点,特别声明“使用此方法的返回值来分配一个缓冲区来保存此流中的所有数据永远是不正确的。”,该方法应命名为
availableWithoutBlocking()