- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
每当我对标题中的任何编写器(正在包装 OutputStreamWriter)调用 .flush()
时,刷新的数据都不会发送;然而,当 .close()
在编写器上调用时,它会刷新并且服务器可以读取数据。我不知道我是否错误地调用了 .write()
或 .readLine()
,或者如果因为读取操作已经被阻止,那就是问题所在?我需要找到一种在不关闭套接字的情况下刷新数据的方法(我将在另一个程序中使用它)。在我拥有的两个 SSCCE 中,都有用于调试的 System.out.println()
。在客户端中,它会转到“检查 4”并且什么都不循环(它在实际程序中做了更多的读取和写入,只是不能在示例中关闭它)。在服务器中,它开始“检查 2”并在 reader.readLine()
处阻塞。我已经阅读了有关 SO 的文章,但我想到的是 readLine()
对于网络程序来说不是一个好主意,我应该实现自己的协议(protocol);然而,这些帖子都没有指向一个好的教程站点,或者任何其他具有好的网络编码教程的站点。以下是 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 的自动刷新属性一旦调用新的行方法就刷新数据。在流中写入任何数据后无需调用 flush。
Unlike the
PrintStream
class, if automatic flushing is enabled it will be done only when one of theprintln
,printf
, orformat
methods is invoked, rather than whenever a newline character happens to be output.
示例代码:
客户:
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());
关于java - BufferedWriter/PrintWriter/OutputStreamWriter 在调用 .close() 之前不刷新缓冲区(通过套接字输出流),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24312147/
我的 Servlet 中有一个 OutputStreamWriter,它使用特定的编码方案,即我必须使用此构造函数 OutputStreamWriter(OutputStream out, Strin
在 Java 中,如果我使用 UTF-16 字符集创建 OutputStreamWriter,Java 是否规定默认字节顺序(UTF-16BE 或UTF-16LE),或者是默认依赖于底层操作系统。 注
这个问题在这里已经有了答案: Write to FileOutputStream from multiple threads in Java (4 个答案) 关闭 5 年前。 java.io.Out
我需要转换 char 的流进入 byte 的流中s,即我需要来自 java.io.Writer 的适配器java.io.OutputStream 的接口(interface), 支持任何有效的 Cha
我有一个通过网络服务上传照片的应用程序。过去,我将文件加载到流中,然后转换为 Base64。然后我通过 OutputStreamWriter 的 write() 方法发布了结果字符串。现在,Web 服
原始代码及其将数据保存到SD卡的工作 // Writing data to internal storage btnSaveData.setOnClickListener(new View.OnCli
transformer.transform(new DOMSource(doc),new StreamResult(new OutputStreamWriter(System.out, "UTF-8"
我想创建一个无缓冲的 OutputStreamWriter。 docs (Java 7) 说 The resulting bytes are accumulated in a buffer befor
为什么第一个示例打印字符串 12345 而第二个示例却没有? public static void main(String[] args) { ByteArrayOutputStrea
刷新要发送到网络套接字的 OutputStreamWriter 会产生哪些副作用。 我有一个程序,每隔几个字节就调用out.flush()。有什么理由让我应该等到我需要的所有字节都在缓冲区中吗? 如果
我正在尝试学习套接字编程。我使用 InputStreamReader 编写客户端,并使用 BufferedReader 读取从服务器发送的消息。对于服务器,如果我用 print 方法编写 PrintW
我正在尝试下面的代码,我的问题是我用来获取字节数组的字符 根据其字符集,char É 应对应于 144,但我在运行代码时得到的值为 -55, 如果我使用 $ 我会得到 36,这是正确的吗? 谢谢你的帮
OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream()); out.write(data); out.flush(
我有一个代码可以将请求发送到 php 页面并且它工作正常,但是突然(我不记得改变了什么)它在模拟器和真实设备上都停止工作 URL url = new URL(this.site);
这是更大的绘图程序(特别是 JavaPlot)的一部分。简而言之,我会尝试绘制一些东西;该图将出现在 out.write(comms); 但一旦它击中就关闭 out.close() 我知道您需要关闭
我在 Linux 服务器上使用 JDK 1.7。我已经安装了 apache 6.0.35 并使用代码 Writer w = new OutputStreamWriter(os,"Unicode");
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在通过这样的套接字发送 ascii: outputStreamWriter(s + (char) 13); outputStreamWriter.flush(); 在我的开发环境中
在服务器端代码中,我正在使用 OutputStreamWriter 编写一个字符串(在浏览器页面上写入)。这被写在一个新窗口中。我需要能够在同一个窗口中编写它。 该类扩展了 HttpServlet,代
我不明白这两个类之间的区别。你什么时候用一个而不是一个?我知道 FileWriter 可以将字符输出到文件,但据我所知,OutputStreamWriter 也可以。这是我测试的一些代码,它们似乎工作
我是一名优秀的程序员,十分优秀!