如何在java中正确地将线程保存和检索到/fom mongodb数据库中?
我有一个本地网络,由一个服务器和多个客户端设备组成。这些设备的配置方式是,它们永久性地尝试连接到一个服务器,监听一个定义良好的端口,比如端口号4000(因此,在客户端,一切都已经设置好) 这是系统的逐步工作方式:如何在java中正确地将线程保存和检索到/fom mongodb数据库中?,java,multithreading,mongodb,sockets,Java,Multithreading,Mongodb,Sockets,我有一个本地网络,由一个服务器和多个客户端设备组成。这些设备的配置方式是,它们永久性地尝试连接到一个服务器,监听一个定义良好的端口,比如端口号4000(因此,在客户端,一切都已经设置好) 这是系统的逐步工作方式: -启动时,服务器接受所有尝试连接的客户端设备(为每个连接创建一个客户端套接字)。 -服务器将创建一个线程,在该线程中,稍后必要时将与客户端进行进一步通信。 -服务器使用关联的套接字将创建的线程保存到mongodb数据库中。 -这将对所有连接的客户端设备执行 稍后,当有命令要发送到所选的
-启动时,服务器接受所有尝试连接的客户端设备(为每个连接创建一个客户端套接字)。
-服务器将创建一个线程,在该线程中,稍后必要时将与客户端进行进一步通信。
-服务器使用关联的套接字将创建的线程保存到mongodb数据库中。
-这将对所有连接的客户端设备执行 稍后,当有命令要发送到所选的客户端设备(通过GUI)时,
-服务器端应首先连接到数据库,并使用相关的客户端套接字检索为该特定客户端创建的线程。
-然后服务器应启动检索到的线程。
-最后,在启动的线程中,应该创建一个输入/输出流,以便将命令写入客户机套接字并读取答案(将进一步处理) 以下是我实现多线程服务器类的方式:
import java.net.*;
import java.util.Arrays;
import java.util.Set;
import com.mongodb.*;
import java.io.*;
public class MultiThreadedServer {
public static void main(String[] args) throws IOException {
// variables's declaration
int portNumber = 4000;
boolean listening = true;
QuoteServerThread thr = null;
Socket clientSocket = null;
MongoClient mongoClient = null;
try {
//Creates a server socket listening on port 4000
ServerSocket serverSocket = new ServerSocket(portNumber);
//set the socket timeout
serverSocket.setSoTimeout(1000);
while (listening ) {
//Accepts a client
clientSocket = serverSocket.accept();
// Creates thread
thr = new ClientServerThread(clientSocket);
//Access the database and saves the thread
mongoClient = new MongoClient();
DB db = mongoClient.getDB( "testingDB" );
DBCollection collection = db.getCollection("testData");
//This is how I though of saving the thread in the DB. I don't know if its the proper way though
// I would also like ot save it with the associate client socket for later use
BasicDBObject doc = new BasicDBObject();
doc.put("threadID", thr.getId());
collection.insert(doc);
}
//Here I would like to access the database and and get the thread with the associated client socket and start the thread
// I don't know how to do it !!!!
} catch (IOException e) {
System.out.println(e);
}
mongoClient.close();
serverSocket.close();
}
这是线程类:
import java.net.*;
import java.io.*;
public class ClientServerThread extends Thread {
private Socket socket = null;
public ClientServerThread(Socket socket) {
super("ClientServerThread");
this.socket = socket;
}
@Override
public void run() {
try{
// Get the client socket, create input and output streams and send command to the client device.
.........
.........
}catch(Exception e){
e.printStackTrace();
}
}
}
我的问题是我不知道:-使用关联的客户端套接字将创建的线程保存到mongodb数据库中的正确方法。 -如何从数据库中检索线程 我真的被困在这里,如果有人能在这方面帮助我,我将不胜感激。
提前谢谢 无法将线程或套接字保存到数据库中
即使在最好的情况下,您也只能保存它们的某种表示形式(线程名称、套接字地址和端口)。您将无法加载线程并让它们再次“激活”。这个问题完全是对线程及其工作方式的误解。你不能持久化它们。你不能在数据库中存储线程或套接字,就像你不能在数据库中存储汽车一样。数据库中只能存储信息。可能有一种很好的方法可以完成您想做的任何事情,但它不会涉及在数据库中存储线程或套接字。谢谢您的评论。对不起,我在这方面没有经验。但在读了一些关于线程的内容后,我也得出了这样的结论:我不能坚持线程。发布这个问题的目的也是为了知道我的理解是否正确。是的,现在我明白/知道这是不可能的。但是,还有其他方法可以这样做吗?好吧,你只是在描述你尝试的解决方案。您应该描述您试图解决的实际问题(客户机是什么?服务器得到的命令是什么?)。经过最少的修改,架构将保持不变,但线程/套接字将保持空闲,而不是持久化。客户端是带有以太网接口的(信号)发送器。首先,关于它们的数据(IP地址、位置(长、纬度)、状态等)存储在数据库中,只能通过GUI发送命令(设置和获取xmitter手册中描述的命令)来修改或检索这些命令(有一个带有字段的表单,可以在其中输入和提交命令)。xmitter的位置(例如在建筑中)显示在地图上(作为标记)我可以点击我想要的xmitter并向它发送命令。所有这些都可以在只连接了一个发射机的情况下正常工作。在这种情况下,我有数千个XMITTER,我希望能够只将命令发送到我单击的发射机(也就是说,数千个发射机中的一个指定IP地址)。你认为最好的方法是什么?那么发射机连接到某个地方并等待命令?听起来有点倒退。我希望发射机等待有人连接并命令他们。我会说发射机已经准备好进行通信,我可以随时连接到它们。但是,每当服务器启动时(即,当我单击地图上的一个标记以便向该特定发射机发送命令时),在“.accept()”之后,数千个发射机中的一个随机发射机可能会连接,而它可能不是我希望命令的发射机。因此,我正在寻找一种方法,在发送命令之前检查连接的发射器是否是我想要命令的发射器。