Java 修改服务器以允许多个客户端同时连接
因此,我已经为任务的前一部分创建了一个服务器和一个客户机,但现在我必须扩展/修改服务器,以便它可以同时处理多个客户机。 我知道我必须要做一些事情Java 修改服务器以允许多个客户端同时连接,java,multithreading,concurrency,runnable,concurrent-programming,Java,Multithreading,Concurrency,Runnable,Concurrent Programming,因此,我已经为任务的前一部分创建了一个服务器和一个客户机,但现在我必须扩展/修改服务器,以便它可以同时处理多个客户机。 我知道我必须要做一些事情 Server server1 = new Server(); Thread thread = new Thread(server1); thread.start(); 并使类服务器实现可运行 但是讲师们关于多线程的笔记不是很清楚,我已经在这个问题的这一部分做了很长一段时间的研究,没有找到答案 下面是我一次为一个客户端编写的连接到服务器的代码。 任
Server server1 = new Server();
Thread thread = new Thread(server1);
thread.start();
并使类服务器实现可运行
但是讲师们关于多线程的笔记不是很清楚,我已经在这个问题的这一部分做了很长一段时间的研究,没有找到答案
下面是我一次为一个客户端编写的连接到服务器的代码。
任何帮助都将不胜感激
Server.java
public class Server {
ArrayList<String> tokens = new ArrayList<String>();
private Socket s;
private Scanner in;
private PrintWriter out;
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(1234);
Server serverInstance = new Server();
System.out.println("Server running. Waiting for a client to connect...");
while (true) {
serverInstance.s = server.accept();
System.out.println("Client connected");
serverInstance.run();
System.out.println("Client disconnected. Waiting for a new client to connect...");
}
}
public void start() {
System.out.println("Starting " + threadName);
if (t == null) {
t = new Thread(this, threadName);
t.start();
}
}
public void run() {
try {
try {
in = new Scanner(s.getInputStream());
out = new PrintWriter(s.getOutputStream());
doService(); // the actual service
}
finally {
s.close();
}
}
catch (IOException e) {
System.err.println(e);
}
}
public void doService() throws IOException {
while (true) {
if (!in.hasNext())
return;
String request = in.next();
System.out.println("Request received: " + request);
// (...) test for type of request here (not implemented)
Request(request);
}
}
public void Request(String request) {
String amountStr = in.next();
if (request.startsWith("SUBMIT")) {
if (tokens.size() < 10) {
tokens.add(amountStr);
System.out.println("Token added");
out.println("OK");
}
else {
System.err.println("Error");
out.println("Error");
}
}
else if (request.startsWith("REMOVE")) {
if (tokens.contains(amountStr)) {
tokens.remove(amountStr);
System.out.println("Tokens removed");
out.println("OK");
}
else {
System.err.println("Error");
out.println("Error");
}
}
else if (request.equals("QUIT")) {
System.err.println("Program ended");
out.println("Program ended");
}
tokens.sort(null);
System.out.println(tokens);
out.flush();
}
}
您试图复制的是RMI几十年来一直在做的事情。Java是开源的,因此您可以了解RMI的工作原理并从中学习。您还可以在internet上查找无数带有/不带RMI的多线程服务器示例 阅读一篇教程(例如),然后尝试一些东西。讲师的笔记并不是唯一可以免费获得多线程信息的地方。整个网络都在您的掌控之中。您是否尝试过
executorservice
,semaphore
?通常,您需要一个线程来侦听新连接,在连接到达时生成新线程或任务。
public class Client {
public static void main(String[] args) throws IOException {
Socket s = new Socket("localhost", 1234);
InputStream instream = s.getInputStream();
OutputStream outstream = s.getOutputStream();
Scanner in = new Scanner(instream);
PrintWriter out = new PrintWriter(outstream);
String request = "SUBMIT hello \n";
out.print(request);
out.flush();
String response = in.nextLine();
System.out.println("Token: " + response);
s.close();
}
}