В Java у нас может быть много способов отправки и получения данных. Некоторые методы находятся ближе к нижнему слою, и некоторые проблемы должны быть решены самими программистами, в то время как некоторые методы имеют относительно высокий уровень абстракции и могут использоваться очень удобно. Эти методы обработки данных от низкого до высокого в соответствии с уровнем абстракции:
1. Ручная кодировка: используйте битовые операции, чтобы кодировать и разрабатывать один за другим.
2. Используйте потоки для автоматического кодирования: используйте outputStream и BytearRayoutputStream в комбинации.
3. Serialization: поместите данные в объект данных, напрямую сериализуйте объект и отправьте его.
Это очень удобно в использовании, но вам нужно обратить внимание на потерю эффективности, а приемник также должен использовать Java.
4.rmi: отправьте все вызовы в метод и напрямую реализуйте удаленный вызов метода.
В методе 1 на самом низком уровне мы должны сами решить некоторые основные проблемы:
1. Целое число отправки: рассмотрим, является ли это большой хвостовой конец или маленький хвостовой конец, без знака или подписанное целое число.
2. Отправить струны: проблемы кодирования должны быть рассмотрены.
3. Типы без ограничений длины, такие как большие целые числа: чтобы кодировать кадр, отличить каждую кадр с помощью разделителя или битов длины.
Многоадресная и трансляция
Мы можем одноадресному копии данных каждому получателю, но это может быть очень неэффективным.
Только UDP -розетки позволяют вещание и многоадреску. Разница между ними заключается в том, что вещание будет отправлено всем достижимым хостам в сети, и некоторые операционные системы могут не позволить обычным пользователям выполнять операции вещания; В то время как многоаправляющая будет отправлена только заинтересованным хозяевам. В частности, он вызывает joingroup () многоадресной карты, чтобы присоединиться к множеству многоадресной группы.
Public Class MultiCastReceiverStest {public static void main (String [] args) выбрасывает исключение {final inetAdress address = inetAddress.getByName ("224.1.1.1"); окончательный порт int = 45599; for (int i = 0; i <5; i ++) {new Thread ("Thread #"+i) {@Override public void run () {try {multicastsocket sock = new MultizeSsocket (порт); sock.joingroup (адрес); Byte [] msg = новый байт [256]; DataGrampacket packet = new DataGrampacket (msg, msg.length); sock.receive (пакет); System.out.println (Thread.currentThread (). GetName () + "eCete:" + new String (packet.getData ())); } catch (ioException e) {e.printstackTrace (); } } } }.начинать(); } Thread.sleep (2000); Multicastsocket Sock = new Multicastsocket (); sock.settimetolive (32); byte [] msg = "helloMulticast" .getBytes (); DataGrampacket packet = new DataGrampacket (msg, msg.length, адрес, порт); Sock.send (пакет); System.out.println ("Сообщение отправлено"); }}