Программа взаимодействия нескольких клиентов с сервером в Java
Я написал программу взаимодействия между сервером и клиентом, и он работал хорошо.
Клиентский модуль
import java.io.*;
import java.net.*;
class Client {
public static void main(String argv[]) throws Exception {
String sentence;
String modifiedSentence;
while(true){
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("myname.domain.com", 2343);
DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
System.out.println("Ready");
sentence = in.readLine();
out.writeBytes(sentence + '\n');
modifiedSentence = in.readLine();
System.out.println(modifiedSentence);
}
clientSocket.close();
}
}
Серверный модуль
import java.net.*;
public class Server {
public static void main(String args[]) throws Exception {
String clientSentence;
String cap_Sentence;
ServerSocket my_Socket = new ServerSocket(2343);
while(true) {
Socket connectionSocket = my_Socket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream out = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = in.readLine();
cap_Sentence = "Raceived:" + clientSentence + '\n';
out.writeBytes(cap_Sentence);
}
}
}
Вышеприведенный код для единой клиент-серверной связи теперь я хочу, чтобы несколько клиентов взаимодействовали с этим сервером. Я искал ее для поиска и обнаружил, что это можно сделать с использованием потока для каждого отдельного клиента, чтобы поговорить с сервером, но так как я новичок, я точно не знаю, как его реализовать. Поэтому, пожалуйста, скажите мне, как это сделать или дать мне некоторое представление об этом.
Ответы
Ответ 1
Класс MainServer
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
boolean listeningSocket = true;
try {
serverSocket = new ServerSocket(2343);
} catch (IOException e) {
System.err.println("Could not listen on port: 2343");
}
while(listeningSocket){
Socket clientSocket = serverSocket.accept();
MiniServer mini = new MiniServer(clientSocket);
mini.start();
}
serverSocket.close();
}
}
Класс помощника
public class MiniServer extends Thread{
private Socket socket = null;
public MiniServer(Socket socket) {
super("MiniServer");
this.socket = socket;
}
public void run(){
//Read input and process here
}
//implement your methods here
}
Ответ 2
Вы хотите посмотреть Java concurrency. Это концепция одной программы Java, выполняющая сразу несколько действий. На высоком уровне вы берете блок while(true) { //... }
и запускаете его как часть метода run()
класса, реализующего Runnable, Вы создадите экземпляры Thread, которые вызывают метод run()
, возможно, один на каждого клиента, которого вы ожидаете.
Для действительно хорошего, глубокого понимания всего, что предлагает Java, когда дело доходит до concurrency, посмотрите Java Concurrency на практике.
Ответ 3
Ну, когда я делаю что-то подобное, я реализую слушателя, который управляет сервером, поэтому, когда клиент (клиент, вероятно, не нуждается в изменениях) подключается, сервер запускает один поток для работы с этим клиентом.
while (!stop)
{
socket = serverSocket.accept();
HiloSocket hiloSocket = new HiloSocket(socket, this);
hiloSocket.start();
}
Конечно, HiloSocket расширяет Thread и имеет логику управления клиентом...