【发布时间】:2011-07-30 03:31:23
【问题描述】:
当我同时连接超过 500 个玩家时,我的(多线程)服务器出现了这个奇怪的问题,PrinterWriter 有时需要超过 100 秒或更长时间(2 分钟)才能完成 flush() 或 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());
如果我在 send() 方法中添加关键字同步,整个服务器开始每 2 秒滞后一次,如果我不这样做,那么一些随机播放器会无缘无故开始滞后。
有人知道吗?这是从哪里来的?我该怎么办?
【问题讨论】:
-
由于您无法控制客户端,因此您必须假设任意数量的客户端可能会停止阅读或速度慢到无法接受。发生这种情况时,您必须考虑如何处理。如果您的客户端读取数据的速度足够快,您应该能够在 10 毫秒内刷新到 500 个连接。即缓冲区总是有可用空间。您不能让一个慢速客户端拖慢其他所有客户端的速度。
标签: java multithreading sockets printwriter