У меня есть два приложения для Android, можно отправить строку по локальной сети на определенный IP-адрес и другое приложение для приема, но я хочу транслировать строку по локальной сети?

Я хочу транслировать строку по локальной сети, но когда я меняю IP-адрес сервера в клиентском коде на 255.255.255.255, он не транслируется. Что мне делать, чтобы транслировать строку по локальной сети? Что мне делать в клиентском коде, чтобы все прослушивающие порты на разных IP-адресах могли получать строку одновременно.

Мой клиент или код для отправки строки:

public class MainActivity extends Activity { private Socket socket; private static final int SERVERPORT = 6000; private static final String SERVER_IP = "192.168.1.10"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new ClientThread()).start(); } public void onClick(View view) { try { EditText et = (EditText) findViewById(R.id.EditText01); String str = et.getText().toString(); PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); out.println(str); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } class ClientThread implements Runnable { @Override public void run() { try { InetAddress serverAddr = InetAddress.getByName(SERVER_IP); socket = new Socket(serverAddr, SERVERPORT); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } } } 

Мой сервер или код для получения строки:

 public class MainActivity extends Activity { private ServerSocket serverSocket; Handler updateConversationHandler; Thread serverThread = null; private TextView text; public static final int SERVERPORT = 6000; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView) findViewById(R.id.text2); updateConversationHandler = new Handler(); this.serverThread = new Thread(new ServerThread()); this.serverThread.start(); } @Override protected void onStop() { super.onStop(); try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } class ServerThread implements Runnable { public void run() { Socket socket = null; try { serverSocket = new ServerSocket(SERVERPORT); } catch (IOException e) { e.printStackTrace(); } while (!Thread.currentThread().isInterrupted()) { try { socket = serverSocket.accept(); CommunicationThread commThread = new CommunicationThread(socket); new Thread(commThread).start(); } catch (IOException e) { e.printStackTrace(); } } } } class CommunicationThread implements Runnable { private Socket clientSocket; private BufferedReader input; public CommunicationThread(Socket clientSocket) { this.clientSocket = clientSocket; try { this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); } catch (IOException e) { e.printStackTrace(); } } public void run() { while (!Thread.currentThread().isInterrupted()) { try { String read = input.readLine(); updateConversationHandler.post(new updateUIThread(read)); } catch (IOException e) { e.printStackTrace(); } } } } class updateUIThread implements Runnable { private String msg; public updateUIThread(String str) { this.msg = str; } @Override public void run() { text.setText(text.getText().toString()+"Client Says: "+ msg + "\n"); } } } 

    Socket – это сокет TCP. Трансляция невозможна при использовании TCP. Если вы хотите использовать TCP, вы не можете транслировать, вы должны иметь доступ к каждому клиенту и отправлять данные по каждому соединению отдельно.

    DatagramSocket – это UDP-сокет. Радиовещание возможно с UDP. Тем не менее, оговорка в том, что UDP не гарантирует, что ваше сообщение действительно поступит. Чтобы гарантировать, что ваше сообщение поступило, вы должны реализовать какой-то протокол подтверждения / повтора, но если вы это сделаете, вы можете использовать TCP, так как это то, что он делает.

    Изменить: Другой вопрос и ответы на комментарии ниже. OP писал (а):

    То как я получу IP-адрес прослушивающих устройств в локальной сети, чтобы сделать соединение отдельно?

    Предметом здесь является обнаружение устройств или сервисов, что является неординарной задачей. Есть много вариантов. Вот некоторые , в определенном порядке:

    1. Укажите IP-адрес сервера в конфигурациях клиентского устройства и попросите их подключиться к вам.
    2. Укажите список IP-адресов клиента в конфигурации сервера и подключите их ко всем.
    3. Внедрите какой-то протокол обнаружения UDP, в котором вы передаете запрос на обнаружение через UDP, и устройства отвечают на информацию об их IP-адресе и т. Д. То же предостережение, что и выше.
    4. Сообщайте о том, что ваш сервер транслирует сообщения UDP о своем присутствии и его IP-адресе, ваши клиенты слушают их и устанавливают TCP-соединения на сервер. Такое же предостережение, как указано выше.
    5. Проверьте существующий протокол обнаружения службы, например jmdns.sourceforge.net (совместимый с Bonjour / zeroconf). Это на самом деле довольно распространенная проблема, и для ее решения существует множество протоколов.
    6. Попросите свой сервер проверить все IP-адреса в своей подсети и попытаться установить TCP-соединение для каждого. Очень много времени, но может быть уместным.

    Варианты 1-2 наиболее просты в реализации, но пользователь требует ручной настройки.

    Варианты 3-5 имеют общую тему: избегайте требований ручной настройки, используя UDP и его возможности широковещания для автоматического обмена информацией о конфигурации. Используйте эту информацию для установления TCP-соединений, а затем используйте TCP для надежной передачи данных. Имейте в виду, что широковещательная передача UDP ограничена по охвату подсети, поэтому вы не можете использовать широковещательное обнаружение для обнаружения компьютеров в других локальных сетях – для этого вам нужно будет сделать какой-то центральный реестр служб с регистрацией на основе TCP и Известный сервер регистрации.

    Вариант 6 позволяет избежать конфигурации вручную за счет чрезвычайно низкой производительности обнаружения и потенциально высокого уровня использования системных ресурсов. Варианты 3-5 направлены на оптимизацию процесса обнаружения.