簡(jiǎn)單講解Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn)
在Java中,我們可以有很多種方法來(lái)發(fā)送和接收數(shù)據(jù)。有的方法比較靠近底層,有些問(wèn)題就需要程序員自己去解決,而有些方法抽象層次比較高,很方便地就可以拿來(lái)使用。這些處理數(shù)據(jù)的方法根據(jù)抽象層次由低到高分別有:
1.手動(dòng)編碼:使用位運(yùn)算逐個(gè)自己編碼和解析。
2.利用流來(lái)自動(dòng)編碼:組合使用OutputStream和ByteArrayOutputStream。
3.序列化:將數(shù)據(jù)放入一個(gè)數(shù)據(jù)對(duì)象中,直接將這個(gè)對(duì)象序列化后發(fā)送。
使用起來(lái)很方便,但要注意效率的損失,以及接收方也要使用Java。
4.RMI:將對(duì)方法的調(diào)用都發(fā)送過(guò)去了,直接實(shí)現(xiàn)了方法的遠(yuǎn)程調(diào)用。
在最底層的方法1中,我們需要自己解決一些底層的問(wèn)題:
1.整型的發(fā)送:要考慮是大尾端還是小尾端,是無(wú)符號(hào)的還是有符號(hào)的整數(shù)。
2.字符串的發(fā)送:要考慮編碼問(wèn)題。
3.無(wú)長(zhǎng)度限制的類型,如大整數(shù):要編碼成幀F(xiàn)rame,通過(guò)定界符或者長(zhǎng)度位
來(lái)區(qū)分每幀。
多播與廣播
我們可以向每個(gè)接受者單播一個(gè)數(shù)據(jù)副本,但這樣做效率可能非常低。
只有UDP套接字允許廣播和多播,兩者的區(qū)別是:廣播會(huì)發(fā)送到網(wǎng)絡(luò)上所有可達(dá)的
主機(jī),有些操作系統(tǒng)可能不允許普通用戶進(jìn)行廣播操作;而多播只發(fā)送給感興趣的
主機(jī)。具體來(lái)說(shuō)是調(diào)用MulticastSocket的joinGroup()加入到多播組的主機(jī)。
public class MulticastReceiverTest { public static void main(String[] args) throws Exception { final InetAddress address = InetAddress.getByName("224.1.1.1"); final int port = 45599; for (int i = 0; i < 5; i++) { new Thread("Thread #" + i){ @Override public void run() { try { MulticastSocket sock = new MulticastSocket(port); sock.joinGroup(address); byte[] msg = new byte[256]; DatagramPacket packet = new DatagramPacket(msg, msg.length); sock.receive(packet); System.out.println(Thread.currentThread().getName() + " receive: " + new String(packet.getData())); } catch (IOException e) { e.printStackTrace(); } } }.start(); } Thread.sleep(2000); MulticastSocket sock = new MulticastSocket(); sock.setTimeToLive(32); byte[] msg = "hellomulticast".getBytes(); DatagramPacket packet = new DatagramPacket(msg, msg.length, address, port); sock.send(packet); System.out.println("Message sent"); } }
- Java 網(wǎng)絡(luò)編程socket編程等詳解
- Java基于Socket實(shí)現(xiàn)網(wǎng)絡(luò)編程實(shí)例詳解
- Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門教程
- Java套接字(Socket)網(wǎng)絡(luò)編程入門
- Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實(shí)例
- java網(wǎng)絡(luò)編程之socket網(wǎng)絡(luò)編程示例(服務(wù)器端/客戶端)
- Java網(wǎng)絡(luò)編程實(shí)現(xiàn)的簡(jiǎn)單端口掃描器示例
- Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法
- Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例
- 詳解Java網(wǎng)絡(luò)編程
相關(guān)文章
SpringBoot整合Shiro的環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了SpringBoot整合Shiro的環(huán)境搭建教程,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2022-12-12SpringBoot2.0集成Swagger2訪問(wèn)404的解決操作
這篇文章主要介紹了SpringBoot2.0集成Swagger2訪問(wèn)404的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Springboot實(shí)現(xiàn)密碼的加密解密
這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)密碼的加密解密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11一個(gè)簡(jiǎn)易的Java多頁(yè)面隊(duì)列爬蟲(chóng)程序
這篇文章主要為大家詳細(xì)介紹了一個(gè)多頁(yè)面的java爬蟲(chóng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08