基本java套接字编程问题

基本java套接字编程问题,java,sockets,inputstream,outputstream,Java,Sockets,Inputstream,Outputstream,我已经阅读了很多关于java套接字编程的问题/回复,但都不适用于我目前的问题 我编写了一个基本的JavaSSL套接字程序,其唯一目的(目前)是在客户端和服务器之间建立ssl连接,并由客户端发送一条签名消息。如果消息被服务器验证,它应该相应地回复(true!),否则回复(false!) 在握手之后,当客户端向服务器发送“消息”并等待服务器响应时,我被卡住了。同时,服务器不处理客户端发送的消息,因此它无法响应,我在那里等待他们中的任何一个进行处理 你能告诉我哪里出错了吗 为了不显示大量不相关的代码,

我已经阅读了很多关于java套接字编程的问题/回复,但都不适用于我目前的问题

我编写了一个基本的JavaSSL套接字程序,其唯一目的(目前)是在客户端和服务器之间建立ssl连接,并由客户端发送一条签名消息。如果消息被服务器验证,它应该相应地回复(true!),否则回复(false!)

在握手之后,当客户端向服务器发送“消息”并等待服务器响应时,我被卡住了。同时,服务器不处理客户端发送的消息,因此它无法响应,我在那里等待他们中的任何一个进行处理

你能告诉我哪里出错了吗

为了不显示大量不相关的代码,我没有包括value对象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");
}
这个

永远的街区。这实际上会在流(连接)关闭时解除阻塞。 所以,由你们来确定消息的结尾。 我的意思是消息的结束并不意味着流的结束。所以,在你收到你的信息后,你将无限期地等待来自频道的smth else。 就像你在这里做的那样

while((ch = in.read()) != '!')
    bos.write(ch);
这个

永远的街区。这实际上会在流(连接)关闭时解除阻塞。 所以,由你们来确定消息的结尾。 我的意思是消息的结束并不意味着流的结束。所以,在你收到你的信息后,你将无限期地等待来自频道的smth else。 就像你在这里做的那样

while((ch = in.read()) != '!')
    bos.write(ch);

看起来您的服务器线程正在运行,尝试从套接字读取,然后结束?因此,只处理握手?关键是,我希望服务器线程检查客户端发送的消息是否有效,并根据该信息做出回答。当我调试代码时,服务器永远不会到达分析客户端消息的位置,因为客户端在尝试读取服务器回复时被卡住。在对等方关闭连接之前,您不会读取EOS。但是我不明白为什么所有的ByteArrayOutputStreams、编码器/解码器等等。您可以通过将ObjectInput/OutputStreams直接包装在套接字流周围来完成所有这些,从而节省大量的时间和空间。看起来您的服务器线程运行,尝试从套接字读取,然后结束?因此,只处理握手?关键是,我希望服务器线程检查客户端发送的消息是否有效,并根据该信息做出回答。当我调试代码时,服务器永远不会到达分析客户端消息的位置,因为客户端在尝试读取服务器回复时被卡住。在对等方关闭连接之前,您不会读取EOS。但是我不明白为什么所有的ByteArrayOutputStreams、编码器/解码器等等。你可以通过直接将ObjectInput/OutputStreams包装在套接字流周围来完成所有这些,并为自己节省大量的时间和空间。谢谢你的评论。我一定是在匆忙中错过了。谢谢你的评论。我一定是匆忙中错过了。