2016-01-26 2 views
-1

У меня есть локальная сеть, состоящая из одного сервера и нескольких клиентских устройств. Устройства настроены таким образом, что они постоянно пытаются подключиться к серверу, слушая четко определенный порт, например, номер порта 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 с соответствующим клиентским сокетом. -Как извлечь потоки из базы данных.

Я действительно застрял здесь, и я был бы признателен, если бы кто-нибудь мог мне помочь в этом.
Спасибо заранее!

+1

Этот вопрос является полным непониманием потоков и их работой. Вы не можете упорствовать в них. – duffymo

+0

Вы не можете хранить нить или сокет в базе данных больше, чем можете хранить автомобиль в одном. В базе данных может храниться только информация. Вероятно, есть хороший способ сделать то, что вы пытаетесь сделать, но это не будет связано с хранением потоков или сокетов в базах данных. –

+0

Спасибо за ваши комментарии. Извините, но я не настолько разбираюсь в этом. Но, немного прочитав о потоках, я также пришел к такому выводу, что я не могу их упорствовать. Цель публикации этого вопроса также заключалась в том, чтобы знать, правильно ли я понимаю. Да, теперь я понимаю/знаю, что это невозможно. Но есть ли вообще делать это иначе? –

ответ

2

Вы не можете сохранить нити или сокеты в базе данных.

Даже в лучшем случае вы только сохранили бы какое-то их представление (имя потока, адрес сокета и порт). Вы не сможете загрузить их и снова «жить».

+0

Ну, вы только описываете свое попытку решения. Вы должны описывать фактическую проблему, которую вы пытаетесь решить (каковы клиенты, какие команды получают сервер?). При минимальной модификации архитектура осталась бы прежней, но вместо этого поток/сокет просто оставался бы бездействующим, а не сохранялся. – Kayaman

+0

Клиенты являются (сигнальными) передатчиками с интерфейсом Ethernet. Прежде всего, данные о них (IP-адрес, положение (длинный, лат), статус и т. Д.) Хранятся в базе данных, и их можно изменять или извлекать только (команды SET и GET, описанные в руководстве xmitter) через GUI (имеется форма с полем, в котором команда может быть введена и отправлена). Положение Xmitters (например, в здании) отображается на картах (например, как маркеры), и я могу нажать на любой xmitter, который я хочу, и отправить ему команду. Все это прекрасно работает, когда подключен только один передатчик. –

+0

Вот ситуация, у меня есть тысячи xmitters, и я хотел был бы иметь возможность отправить команду только передатчику, на который я нажал (что означает один указанный IP-адрес, среди тысяч из них). Что думаешь, что это лучший способ сделать это? –

Смежные вопросы