我们正在开发这款可以向智能设备发送命令的应用。智能设备使用ServerSocket连接到应用程序。当设备连接时,应用程序将创建2个线程(用于发送命令和接收响应)。因此,如果连接了50个设备,该应用程序将创建100个线程。
如果已经连接了大约60个设备,它们的线程将被android杀死。还有一些情况是,当设备断开连接时,应用程序无法检测到它。
我们希望将最多200台设备连接到该应用。
所以我的问题:
非常感谢任何关于正确方向的提示。谢谢
以下是代码:
ConnectionThread.class
public class ConnectionThread extends Thread {
private ServerSocket serverSocket;
@Override
public void run() {
Socket socket;
try {
serverSocket = new ServerSocket(PORT);
listener.onStartedListening();
} catch (IOException e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted()) {
try{
socket = serverSocket.accept();
ReceiveThread receiveThread = new ReceiveThread();
receiveThread.start();
SendThread sendThrd = new SendThread();
sendThrd.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ReceiveThread和SendThread都扩展了Thread。它们处理命令的发送和从设备接收响应。
答案 0 :(得分:0)
根据我对套接字的经验,您可以将两个IO流放在同一个线程上,这样至少应该减少线程数。至于断开连接问题,您应该让服务器发送定期ping并为响应设置超时间隔,之后应该终止连接。
答案 1 :(得分:0)
我的建议是使用NanoHTTP https://github.com/NanoHttpd/nanohttpd此轮已经实现,我会要求您根据需要进行修改。 我使用过,它也支持https。
答案 2 :(得分:0)
你没有。这就是为什么自2002年以来以Selector的形式用Java发明和实现非阻塞IO的原因。
Threads的核心问题是,在某些时候,仅仅在线程之间切换所花费的时间比线程本身可以安全的花费更多。最简单的解决方案是只有一个线程来接收所有请求并决定是否将它们转发给工作线程。这个单一线程可以回答所有需要更快回答的请求,而不是自己生成一个线程(如echo请求),并且让重量级工作完成后台线程,这些线程受到内核数量的限制。因此,在这种情况下,您必须管理核心* 2个线程。
由于这是一项非常古老的技术,因此有很多库可供您使用。如另一个答案所述:这里不需要重新发明轮子。