Я являюсь новым для Снабжения программирования сокетом в Java и пытался понять, не ли ниже кода неправильный поступок. Мой вопрос:
У меня может быть несколько клиентов на каждом потоке, пытающемся соединяться с экземпляром сервера в той же программе и ожидать, что сервер считает и запишет данные с изоляцией между клиентами"
public class Client extends Thread
{
...
void run()
{
Socket socket = new Socket("localhost", 1234);
doIO(socket);
}
}
public class Server extends Thread
{
...
void run()
{
// serverSocket on "localhost", 1234
Socket clientSock = serverSocket.accept();
executor.execute(new ClientWorker(clientSock));
}
}
Теперь у меня может быть несколько Клиентских экземпляров на различных потоках, пытающихся соединяться на том же порте текущей машины?
Например,
Server s = new Server("localhost", 1234);
s.start();
Client[] c = new Client[10];
for (int i = 0; i < c.length; ++i)
{
c.start();
}
Да, не имеет значения, являются ли ваши клиенты локальными или удаленными. Важным моментом в вашем примере является то, что ClientWorker является потокобезопасным, поскольку на вашем сервере будет несколько экземпляров этого класса (по одному для каждого клиентского соединения).
Да, однако только один клиент сможет подключиться при выполнении потока, как написано.
Вы можете просто поместить свой сервер run () в цикл while true, чтобы позволить нескольким клиентам подключаться. В зависимости от исполнителя, они будут выполняться либо последовательно, либо параллельно.
public class Server extends Thread
{
...
void run()
{
while(true){
// serverSocket on "localhost", 1234
Socket clientSock = serverSocket.accept();
executor.execute(new ClientWorker(clientSock));
}
}
}
Итак. Для начала:
Вы можете принимать больше клиентов с одним серверным сокетом, потому что вы принимаете только одного в run
-методе. Вам нужно просто вызвать accept()
второй раз.
Затем, вы в своем цикле for: сначала должны каждый раз создавать новый объект Client
. Затем вы можете вызывать c[i].start();
, а не c.start()
.
Теперь я могу иметь несколько экземпляров на разных потоках, пытающихся подключиться к одному и тому же порту текущей машины?
Да, можно. Просто создайте новые потоки и запустите их. Это должно работать идеально.
Ожидайте, что сервер будет читать и записывать данные с изоляцией между клиентами
Вы можете использовать свой опыт базовых методов ввода-вывода, например, с file-io:
OutputStream os = socket.getOutputStream();
PrintStream pw = new PrintStream(os, true); // Or PrintWriter, I don't know what the best one is.
pw.println("Hello, other side of the connection!");
А для чтения используйте BufferedReader.
Пока у вас есть только один объект, пытающийся привязать порт для прослушивания, тогда нет проблем с подключением нескольких клиентов.
В этом примере ваш Сервер
принимает и обрабатывает одно клиентское соединение за раз. У вас может быть столько клиентов
, сколько вы хотите, пытающихся подключиться, но одновременно будет обрабатываться только один.
Неясно, является ли логика вашего исполнителя многопоточной, поскольку вы не предоставили реализацию. Если исполнитель делегирует пулу потоков или что-то в этом роде, вам необходимо убедиться, что ваш ClientWorker
является потокобезопасным, поскольку у вас будет несколько экземпляров, выполняющихся параллельно.
Я, конечно, предполагаю, что ваш клиент
также является потокобезопасным, поскольку ваш вопрос касается только сервера
.