У меня есть локальная сеть, состоящая из одного сервера и нескольких клиентских устройств. Устройства настроены таким образом, что они постоянно пытаются подключиться к серверу, слушая четко определенный порт, например, номер порта 4000 (так что на стороне клиента все уже установлено).Как правильно сохранять и извлекать потоки в/fom mongodb database в java?
Это поэтапно, как работает система:
- При запуске сервер принимает все клиентские устройства, пытающиеся подключиться (для каждого соединения создается один клиентский сокет).
- Сервер создает поток, в котором последующая связь с клиентом будет выполняться по мере необходимости.
- Сервер сохраняет созданный поток в базу данных mongodb с соответствующими сокетами.
-Этот будет сделано для всех подключенных клиентских устройств
Позже, когда будет команда для отправки выбранного устройства клиента (через графический интерфейс),
-The на стороне сервера должен сначала подключиться к базу данных и получить поток, созданный для этого конкретного клиента, с соответствующим клиентским сокетом.
-Тогда сервер должен запустить извлеченный поток.
-И наконец, в начальном потоке должен быть создан поток ввода-вывода, чтобы написать команду в клиентский сокет и прочитать ответ (который будет обрабатываться далее).
Это, как я реализовал многопоточный класс сервера:
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();
}
}
}
Моя проблема заключается в том, что я не знаю:
-The правильный путь для сохранения созданного потока в базе данных mongodb с соответствующим клиентским сокетом. -Как извлечь потоки из базы данных.
Я действительно застрял здесь, и я был бы признателен, если бы кто-нибудь мог мне помочь в этом.
Спасибо заранее!
Этот вопрос является полным непониманием потоков и их работой. Вы не можете упорствовать в них. – duffymo
Вы не можете хранить нить или сокет в базе данных больше, чем можете хранить автомобиль в одном. В базе данных может храниться только информация. Вероятно, есть хороший способ сделать то, что вы пытаетесь сделать, но это не будет связано с хранением потоков или сокетов в базах данных. –
Спасибо за ваши комментарии. Извините, но я не настолько разбираюсь в этом. Но, немного прочитав о потоках, я также пришел к такому выводу, что я не могу их упорствовать. Цель публикации этого вопроса также заключалась в том, чтобы знать, правильно ли я понимаю. Да, теперь я понимаю/знаю, что это невозможно. Но есть ли вообще делать это иначе? –