Сокеты Java: несколько клиентских потоков на том же порте на той же машине?

Я являюсь новым для Снабжения программирования сокетом в 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();
   }
18
задан espcorrupt 12 May 2010 в 18:26
поделиться

5 ответов

Да, не имеет значения, являются ли ваши клиенты локальными или удаленными. Важным моментом в вашем примере является то, что ClientWorker является потокобезопасным, поскольку на вашем сервере будет несколько экземпляров этого класса (по одному для каждого клиентского соединения).

0
ответ дан 30 November 2019 в 09:21
поделиться

Да, однако только один клиент сможет подключиться при выполнении потока, как написано.

Вы можете просто поместить свой сервер 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));  
           }
       }  
   } 
10
ответ дан 30 November 2019 в 09:21
поделиться

Итак. Для начала:

Вы можете принимать больше клиентов с одним серверным сокетом, потому что вы принимаете только одного в 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.

0
ответ дан 30 November 2019 в 09:21
поделиться

Пока у вас есть только один объект, пытающийся привязать порт для прослушивания, тогда нет проблем с подключением нескольких клиентов.

3
ответ дан 30 November 2019 в 09:21
поделиться

В этом примере ваш Сервер принимает и обрабатывает одно клиентское соединение за раз. У вас может быть столько клиентов , сколько вы хотите, пытающихся подключиться, но одновременно будет обрабатываться только один.

Неясно, является ли логика вашего исполнителя многопоточной, поскольку вы не предоставили реализацию. Если исполнитель делегирует пулу потоков или что-то в этом роде, вам необходимо убедиться, что ваш ClientWorker является потокобезопасным, поскольку у вас будет несколько экземпляров, выполняющихся параллельно.

Я, конечно, предполагаю, что ваш клиент также является потокобезопасным, поскольку ваш вопрос касается только сервера .

1
ответ дан 30 November 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: