如何解决Websocket:通信中断
在我的Web应用程序中,我的websocket通信有问题。有时,当我尝试向多个客户端发送消息时(通常我们有30-40个客户端),应用程序被卡住了。 查看日志文件,似乎一切都挂在“广播消息”方法上(在此方法中,我使用了同步锁)。
下面是这些类的实现。
网络套接字:
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/websocket")
public class WebSocketServer
{
private static Set<Session> clients = Collections.synchronizedSet(new HashSet<Session>());
@OnMessage
public void onMessage(String message,Session session) throws IOException,InterruptedException
{
if (message.equals("ping"))
{
session.getBasicRemote().sendText("pong");
}
}
@OnOpen
public void onOpen(Session session)
{
clients.add(session);
}
@OnClose
public void onClose(Session session)
{
clients.remove(session);
}
public static void broadcastMessage(String message) throws IOException,InterruptedException
{
broadcastMessage(message,null);
}
private static void broadcastMessage(String message,InterruptedException
{
synchronized (clients)
{
for (Session client : clients)
{
if (session == null || !client.equals(session))
{
client.getBasicRemote().sendText(message);
}
}
}
}
}
然后我在服务器启动时安排了一个servlet,该servlet安排了一个线程(每秒):
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet
{
private static final long serialVersionUID = 5064961381596268407L;
@Override
public void init() throws ServletException
{
Long period = Long.parseLong(1000);
new MyThread().schedule(new Date(),period);
}
@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
}
@Override
protected void doPost(HttpServletRequest request,IOException
{
}
}
这是线程:
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.log4j.Logger;
public class MyThread
{
private static Timer timer;
private String PATH = "C:\\Users\\administrator\\Pictures";
private Logger log = Logger.getLogger("pic");
public void schedule(Date date,Long period)
{
if (timer != null)
{
timer.cancel();
}
timer = new Timer();
if (date == null)
{
date = new Date();
}
if (period != null)
{
timer.schedule(new ThreadLogger(),date,1000 * period.longValue());
}
else
{
timer.schedule(new ThreadLogger(),date);
}
}
public class ThreadLogger extends TimerTask
{
public void run()
{
log.debug("MyThread.run ===========================================================");
log.debug("Directory => " + PATH);
File dir = new File(PATH);
FileFilterDateIntervalUtils filter = new FileFilterDateIntervalUtils(new Date());
File[] files = dir.listFiles(filter);
if (files != null && files.length > 0)
{
Arrays.sort(files,new Comparator<File>()
{
public int compare(File f1,File f2)
{
return Long.valueOf(f2.lastModified()).compareTo(f1.lastModified());
}
});
try
{
log.debug("Found file => " + files[0].getName());
WebSocketServer.broadcastMessage(files[0].getName());
}
catch (Exception e)
{
log.error("Error: " + e.getMessage(),e);
}
}
else
{
log.debug("Alert: 0 files");
}
log.debug("================================================================================");
}
}
}
仅通过预定线程调用websocket的broadcastMessage方法!每个客户端每分钟都会发送一次ping消息。
您是否知道应用程序为何卡住的原因?我该怎么解决?
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。