gpt4 book ai didi

java - PrintWriter 的flush() 和print() 速度非常慢。多线程和套接字

转载 作者:行者123 更新时间:2023-12-01 15:47:19 24 4
gpt4 key购买 nike

当我同时连接超过 500 个玩家时,我的(多线程)服务器遇到了这个奇怪的问题,PrinterWriter 有时需要超过 100 秒或更长时间(2 分钟)才能完成lush() 或 print()。

这是代码:

public static void send(Player p, String packet)
{
PrintWriter out = p.get_out();
if(out != null && !packet.equals("") && !packet.equals(""+(char)0x00))
{
packet = Crypter.toUtf(packet);
out.print((packet)+(char)0x00);
out.flush();
}
}

printWriter 是这样的:

_in = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
_out = new PrintWriter(_socket.getOutputStream());

如果我将关键字synchronized添加到send()方法中,整个服务器就会开始每2秒滞后一次,如果我不这样做,那么一些随机玩家就会无缘无故地开始滞后。

有人有什么想法吗?这是从哪里来的?我该怎么办?

最佳答案

打印写入器围绕套接字的输出流,因此我将猜测并说套接字的输出缓冲区已满,因此写入/刷新调用将阻塞,直到缓冲区有足够的空间来容纳消息正在发送。

如果数据写入套接字发送缓冲区的速度快于传输到客户端的速度(或快于客户端接收数据的速度),则套接字发送缓冲区可能会变满。

编辑:

附注如果您遇到可扩展性问题,可能是由于使用 java.io(每个套接字需要一个线程)而不是 java.nio(在这种情况下,单个线程可以检测并在那些具有挂起数据的套接字上执行操作) 。 nio旨在支持必须扩展到大量连接的应用程序,但编程模型更加困难。

关于java - PrintWriter 的flush() 和print() 速度非常慢。多线程和套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com