BufferedWriter / PrintWriter / OutputStreamWriter不会刷新缓冲区,直到调用.close()为止(通过套接字输出流)

李维

每当我调用.flush()标题中的任何作者(包装了OutputStreamWriter的作者)时,都不会发送刷新的数据;但是,在.close()写入器上被调用时,它将刷新并且服务器可以读取数据。我不知道我是在打电话.write()还是.readLine()打错了电话,或者,由于读取操作已经被阻止,这是问题所在吗?我需要找到一种无需关闭套接字即可刷新数据的方法(我将在另一个程序中使用它)。在我拥有的两个SSCCE中,都有System.out.println()用于调试的。在客户端中,它将转到“ check 4”并不执行任何循环(它在实际程序中执行更多读取和写入操作,只是在示例中无法关闭它)。在服务器中,它要“检查2”并在处阻塞reader.readLine()我已经阅读了有关SO的内容,但readLine()对于网络程序而言,这不是一个好主意,我应该实现自己的协议;但是,这些帖子都没有指向良好的教程网站,也没有指向具有良好网络编码教程的其他内容。以下是SSCCE:

客户SSCCE

package testClient;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Random;

import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class Client {

    public static void main(String[] args) {
        try {
            Socket s = new Socket("127.0.0.1",48878);
            System.out.println("check 1");
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream(),"UTF-8"));
            System.out.println("check 2");
            pw.write("Hello StackOverFlow.");
            System.out.println("check 3");
            pw.flush();
            System.out.println("check 4");
            while(true){}
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

服务器SSCCE

package testServer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {


    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(48878);
            Socket client = ss.accept();
            System.out.println("check 1");
            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
            System.out.println("check 2");
            byte[] buffer = new byte[20];
            int i = 0;;
            int x;
            while((x=reader.read())!=-1) {
                buffer[i] += (byte)x;
                i = i++;
            }
            String text = new String(buffer,"UTF-8");
            System.out.println("check 3");
            System.out.println(text);
            client.close();
            ss.close();
        } catch (IOException  e) {
            e.printStackTrace();
        }
    }

}
布拉吉

尝试使用PrintWriter的auto flush属性,属性会在调用新行方法后刷新数据。在流中写入任何数据后,无需调用flush。

不像PrintStream类,如果启用自动刷新,一定会完成,只有当的一个printlnprintf或者format被调用的方法,而不是当一个换行符恰好是输出。

样例代码:

客户:

PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream(),"UTF-8"),true);
pw.println("Hello StackOverFlow.");

服务器:

BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
System.out.println(reader.readLine());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档