Я новичок в программировании сокетов на 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();
}
Спасибо, ребята, я думал порта как одного физического лица (например, провода), поскольку она имеет единственное число. Поэтому я думал, что он может использоваться только одним клиентским сокетом, иначе несколько клиентских сокетов могут записываться в один и тот же провод за раз. Но из ваших ответов я думаю, что сам порт состоит из нескольких ресурсов (например, как блоки памяти), но сокет будет привязан к одному из тех блоков, которые, вероятно, индексируются некоторым ключом привязки. – espcorrupt
Порт - это просто номер. Это не соответствует чему-либо физическому. A * connection * определяется кортежем {протокол, адрес источника, порт источника, адрес цели, целевой порт}. Клиентская ОС позаботится об обеспечении разных номеров исходящих портов для каждого исходящего соединения. Таким образом, нет никаких проблем при наличии нескольких входящих соединений с одним и тем же целевым хостом/портом, даже если они все находятся на одном и том же узле исходного клиента. – EJP