我有一个本地网络,包含一个服务器和多个客户端设备。这些设备的配置方式使它们永久地尝试连接到服务器,监听一个定义良好的端口,比如端口号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数据库的正确方法。
- 如何从数据库中检索线程。
我真的被困在这里,如果有人能帮助我,我将不胜感激 在此先感谢!!
答案 0 :(得分:2)
您无法将线程或套接字保存到数据库中。
即使在最好的情况下,您也只能保存它们的某种表示形式(线程名称,套接字地址和端口)。你不可能加载它们并让它们活着#34;试。