Причина, по которой вам нужен поток для каждого соединения, такова:
Представьте, что у вас есть два открытых сокета, sock1 и sock2.Чтобы читать из этих сокетов, вы можете вызвать что-то вроде
InputStream in1 = sock1.getInputStream();
InputStream in2 = sock2.getInputStream();
Теперь, чтобы читать из sock1, вы вызываете
in1.read(buffer);
, где «буфер» - это байтовый массив, в котором высохраните прочитанные вами байты.
Однако read () является блокирующим вызовом - другими словами, он не возвращается, и вы не можете выполнить следующую строку, пока не останется несколько байтов длячитать().Поэтому, если вы попытаетесь прочитать sock1, вы никогда не сможете прочитать sock2, и наоборот, если они находятся в одном потоке.
Таким образом, если у вас есть один поток на соединение, каждый поток может вызвать read() и дождитесь ввода.Если ввод поступает во время выполнения одного из других потоков, он ждет, пока не наступит очередь этого потока, и затем продолжится.
Чтобы реально реализовать это, все, что вам нужно сделать, это вставить код для обработки одного соединения вкласс, расширяющий Thread.
Здесь задействовано множество деталей - я бы предложил образец Android BluetoothChat в качестве хорошего учебника.