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

时间:2016-01-26 10:50:33

标签: java multithreading mongodb sockets

我有一个本地网络,包含一个服务器和多个客户端设备。这些设备的配置方式使它们永久地尝试连接到服务器,监听一个定义良好的端口,比如端口号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数据库的正确方法。 - 如何从数据库中检索线程。

我真的被困在这里,如果有人能帮助我,我将不胜感激 在此先感谢!!

1 个答案:

答案 0 :(得分:2)

您无法将线程或套接字保存到数据库中。

即使在最好的情况下,您也只能保存它们的某种表示形式(线程名称,套接字地址和端口)。你不可能加载它们并让它们活着#34;试。