- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
服务器:Linux
测试客户端:OS X、CentOS、Windows
服务器/客户端编程语言:Java
Server-side
SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =
(SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
InputStream inputstream = sslsocket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String string = null;
while ((string = bufferedreader.readLine()) != null) {
System.out.println(string);
System.out.flush();
}
使用此选项执行的服务器程序
-Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456
证书:在 Linux 上使用 keytool 创建
keytool -genkey -keystore mySrvKeystore -keyalg RSA
客户端
....
SocketAddress sa = new InetSocketAddress(ip, port);
....
SSLContext sslContext = SSLContext.getInstance("SSL");
....
sslContext.init(.........., new SecureRandom());
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
this.clientSock = socketFactory.createSocket();
this.clientSock.connect(sa, this.ConnectTimeout);
this.clientSock.setSoTimeout(this.RecvTimeout);
this.clientSock.setReuseAddress(true);
....
public boolean writeTo(String procname, BufferedOutputStream out, byte[] data)
{....
out.write(data, 0, data.length);
out.flush();
....}
结果:一切正常,但只有来自 Windows 的客户端程序,写入输出流时会延迟。
... 4-5秒,此时无缘无故卡在这里...
延迟发生在从 Windows 7、Windows XP 执行的同一 java 客户端简单程序上。从 3 台不同的 Windows 机器上测试。其他地方都很好。
所以我尝试使用 C 和 PHP 构建 SSL 简单客户端,在 Windows 上运行良好。这意味着只有 Java 客户端方法不起作用。
有没有人有任何想法或类似的经验?我看过一些怀疑 WINS/DNS 的帖子,但这里似乎并非如此。同样有趣的是,每台 Windows 机器总是有大约 4-5 秒的延迟。
非常感谢您的提前评论。
最佳答案
我遇到过类似的问题。使用 tcpdump,我发现从客户端到服务器的 TCP 连接(SYN、SYN-ACK、ACK)几乎是瞬间发生的,然后是一个神秘的暂停,然后客户端才真正发送数据。
tcpdump 输出表明,在连接之后,客户端(在 Windows 上运行)立即发送一个 NetBIOS 名称请求(大概是为了找出服务器的名称,也许这样它可以选择一个合适的证书或其他东西)和服务器立即用 ICMP 响应回复说 NetBIOS UDP (137) 端口无法访问。看起来 Windows 客户端忽略了该响应。 1.5 秒后,Windows 客户端发送另一个 NetBIOS 名称请求,服务器发送相同的 ICMP 响应。再过 1.5 秒后,Windows 客户端发送第三个也是最后一个 NetBIOS 名称请求,服务器发回相同的 ICMP 响应。 1.5秒后,socket数据终于传输完毕。
所以看起来 Windows 尝试了 3 次以确定服务器的 NetBIOS 名称,并且每次等待 1.5 秒。最终(4.5 秒后)它放弃并发送数据。我认为这可以解释您报告的 4-5 秒暂停。
消除暂停的一种解决方法是为服务器添加“主机”文件条目。 (在该文件中使用什么主机名并不重要。仅仅存在一个 IP 地址就避免了对 NetBIOS 名称解析的需要。)可能还有其他选择(例如,将服务器名称添加到 WINS 或 DNS 或其他东西,具体取决于您的 Windows 机器使用什么进行名称解析)。
关于java - SSL Socket OutputStream Write Slow only on Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15677580/
例如: 我使用 ObjectInput/OutputStream 通过 Socket outputStream 发送一个 byte[]: ObjectOutputStream myOutput = n
在我看来,ObjectInputStream/ObjectOutputStream和DataInputStream/DataOutputStream都可以应用于实例原始类型。当ObjectInputS
这个问题已经有答案了: Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()? (6 个回答)
如果我只是在输出流中调用 close(),输出是有保证的,还是需要我总是调用 flush()? 最佳答案 虽然 close 应该调用 flush,但它比这要复杂一些... 首先,装饰器(如 Buffe
我正在通过 USB 连接将数据从我的 Java 应用程序推送到另一端的 Arduino。 Arduino 只能在其末尾缓冲 64 字节的数据,因此我必须限制从我的 Java 应用程序的每个“gulp”
关注 question我之前问过:我正在实现 ByteArrayOutputStream有容量限制。我的主要限制是可用内存量。所以有这样的流os : 当我写的不止是 1MB到我需要“停止”的输出流。
在HttpServlet.doGet(...)中,我使用以下命令从OutputStream中获取HttpServletResponse: resp.getOutputStream(); 写入该输出流时
基本上,我想将控制台输出重定向到 javafx TextArea。我现在正在使用此代码。 public static void init() { //GUI code. TextArea va
我正在尝试从服务器下载文件,服务器向我发送一个没有扩展名的八位字节流,但它在 http header 中发送扩展名(名称为 fileType)。 我想做的是读取该http header ,然后将文件类
我使用一个 API(有关更多信息,请参阅下文),它接受 OutputStream 来捕获数据。相反,我想提供一个 Consumer 的 Strings 来消耗一行又一行的数据。因此我必须编写一个 Ou
我正在处理 Microsoft word 2007 文档。 我的目标是实现: 表格单元格。 段落行。 所以,我的代码可以完成这项工作,但问题是当我使用 FileOutputStream 写入文件时,它
我有一个OutputStream,可以将其初始化为OutputStreams 链。可以有任何级别的链接。唯一可以保证的是链的末尾是一个 FileOutputStream。 我需要使用 FileOutp
我正在为类制作一个简单的 Java 程序,该程序应该将变量 petName、petType 和 numVisits 输出到名为“PatientData.txt”的 txt 文件。我正确打印了 petT
我有以下代码在 Java 程序中将字节数组写入 OutputStream。 public static void write(OutputStream out, ArrayList buffer) t
所以我开始思考这将是一个简单的 1 或 2 行代码,以便我将 OutputStream 转换为字符串,以便我可以用我的逻辑更好地检查它。 所以下面的代码是我目前正在使用的代码。如果我只想将输出写入控制
Java 中的OutputStream 有一个名为flush() 的方法。根据其文档: Flushes this output stream and forces any buffered outpu
好的,我正在实现 NSOutput 和输入流。当它们被初始化时,流打开并连接到我在我的 PC 上运行的 TCPServer,但随后似乎在初始化函数之外关闭一次,或者流可能没有正确存储。我不太确定,所以
这个问题在这里已经有了答案: How do you clear a stringstream variable? (9 个回答) 关闭 9 年前。 目前我正在像这样将一些数据存储到输出流中 std:
我想写入正在运行的进程(不是 Java)的标准输入。如何直接获取 Process 对象或 OutputStream? Runtime.getRuntime() 只能帮助我产生新的东西,而不是找到现有的
将一些处理后的内容写出到输出流后,我需要重新访问流的开头并写出一些内容元数据。我正在写入的数据非常大,多达 4Gb,并且可能会直接写入文件或内存缓冲区,具体取决于各种环境因素。 如何实现一个 Outp
我是一名优秀的程序员,十分优秀!