#java #sockets #server #client #serversocket
#java #сокеты #сервер #клиент #serversocket
Вопрос:
Я пытаюсь установить связь между сервером (класс NewServer) и клиентом (класс NewClient), принимая два клиентских сообщения. Я знаю, как это сделать с одним клиентом, но не с несколькими клиентскими подключениями.
- Должен ли я создавать 2 считывателя в классе Client?
- Могу ли я сделать это рекурсивным способом?
Класс сервера:
import java.net.*;
import java.io.*;
public class NewServer
{
//Create Server Socket and a Client Socket for each Client.
static ServerSocket server;
static Socket client1;
static Socket client2;
//Create OutputStreams to send information to each Client.
static DataOutputStream client1writer;
static DataOutputStream client2writer;
static final int PORT = 9999;
//Main Method
public static void main(String[]args)
{
//Try-Catch Block for Socket Errors.
try
{
//Create the Server Socket as a Host.
server = new ServerSocket(PORT);
//Connect Client 1 – First run of the Client class.
client1 = server.accept();
client1writer = new
DataOutputStream(client1.getOutputStream());
//Connect Client 2 – Second run of the Client class.
client2 = server.accept();
client2writer = new
DataOutputStream(client2.getOutputStream());
//Assign each Client an ID number – this is how the Client will know
// which individual Client it’s representing in RunTime.
int ID1 = 8675309;
int ID2 = 8675308;
//Tell both Clients which one they are representing.
client1writer.writeInt(ID1);
client2writer.writeInt(ID2);
//Close all Sockets when finished.
client1.close();
client2.close();
server.close();
}
catch (IOException IOex)
{
System.out.println("Server Error.");
}
}
}
Клиентский класс:
import java.net.*;
import java.io.*;
public class NewClient {
static Socket client = null;
static final int PORT = 9999;
static final String IP = "localhost";
public static void main(String[] args) throws IOException {
int id1;
int id2;
try{
client = new Socket(IP,PORT);
System.out.println("Connection successful!");
reader = new DataInputStream(client.getInputStream());
id1 = reader.readInt();
id2 = reader.readInt();
System.out.println("The id of the user is " id);
//Closing everything
client.close();
reader.close();
}catch(IOException error) {
System.err.println("Server error.");
}
}
}
Ответ №1:
Вы можете достичь этого, запустив отдельный поток (также известный как простые потоки) для каждого нового клиентского соединения, а затем вызвать server.accept()
, который выполняется в цикле. Это полезно в качестве учебного примера, но не поможет вам достичь того, что вам нужно, поскольку вы теряете контроль над потоками.
Второй способ — использовать службу исполнителя, которая обеспечивает лучший контроль управления над вышеупомянутым решением.