Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中正确地将线程保存和检索到/fom mongodb数据库中?_Java_Multithreading_Mongodb_Sockets - Fatal编程技术网

如何在java中正确地将线程保存和检索到/fom mongodb数据库中?

如何在java中正确地将线程保存和检索到/fom mongodb数据库中?,java,multithreading,mongodb,sockets,Java,Multithreading,Mongodb,Sockets,我有一个本地网络,由一个服务器和多个客户端设备组成。这些设备的配置方式是,它们永久性地尝试连接到一个服务器,监听一个定义良好的端口,比如端口号4000(因此,在客户端,一切都已经设置好) 这是系统的逐步工作方式: -启动时,服务器接受所有尝试连接的客户端设备(为每个连接创建一个客户端套接字)。 -服务器将创建一个线程,在该线程中,稍后必要时将与客户端进行进一步通信。 -服务器使用关联的套接字将创建的线程保存到mongodb数据库中。 -这将对所有连接的客户端设备执行 稍后,当有命令要发送到所选的

我有一个本地网络,由一个服务器和多个客户端设备组成。这些设备的配置方式是,它们永久性地尝试连接到一个服务器,监听一个定义良好的端口,比如端口号4000(因此,在客户端,一切都已经设置好)

这是系统的逐步工作方式:
-启动时,服务器接受所有尝试连接的客户端设备(为每个连接创建一个客户端套接字)。
-服务器将创建一个线程,在该线程中,稍后必要时将与客户端进行进一步通信。
-服务器使用关联的套接字将创建的线程保存到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()”之后,数千个发射机中的一个随机发射机可能会连接,而它可能不是我希望命令的发射机。因此,我正在寻找一种方法,在发送命令之前检查连接的发射器是否是我想要命令的发射器。