日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解UDP協議格式及在java中的使用

瀏覽:301日期:2022-08-16 16:12:04

UDP是面向無連接的通訊協議,由于通訊不需要連接,所以可以實現廣播發送。UDP通訊時不需要接收方確認,屬于不可靠的傳輸,可能會出現丟包現象,實際應用中要求程序員編程驗證。

UDP適用于DNS、視頻音頻等多媒體通信、廣播通信(廣播、多播)。例如我們常用的QQ,就是一個以UDP為主,TCP為輔的通訊協議。

UDP報文格式如下:

詳解UDP協議格式及在java中的使用

UDP首部有8個字節,由4個字段構成,每個字段都是兩個字節,

源端口:數據發送方的端口號. 目的端口:數據接收方的端口號。 長度:UDP數據報的整個長度(包括首部和數據),其最小值為8(只有首部)。 校驗和:檢測UDP數據報在傳輸中是否有錯,有錯則丟棄。

可以使用nc發送UDP數據包:echo hello | nc -uv 127.0.0.1 9999。

用tcpdump抓取到的數據包如下(注意先運行tcpdump,然后再執行nc命令):

# tcpdump -i lo -X udp port 9999tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes11:19:39.267912 IP localhost.45666 > localhost.distinct: UDP, length 60x0000: 4500 0022 5914 4000 4011 e3b4 7f00 0001 E..'Y.@.@.......0x0010: 7f00 0001 b262 270f 000e fe21 6865 6c6c .....b’....!hell0x0020: 6f0a o.... ...

說明:

源端口:0xb262,十進制的45666。 目的端口:0x270f,十進制的9999。 長度:0x000e,14個字節的報文長度。 校驗和:0xfe21。bio之單播

單播就是一對一通信。

服務器端代碼如下:

package com.morris.udp.bio.single;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;public class Server { public static void main(String[] args) throws IOException { DatagramSocket datagramSocket = new DatagramSocket(9999); byte[] bytes = new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length); datagramSocket.receive(datagramPacket); System.out.println('receive from client: ' + new String(bytes)); byte[] req = 'hello client'.getBytes(); DatagramPacket resp = new DatagramPacket(req, req.length, datagramPacket.getSocketAddress()); datagramSocket.send(resp); }}

客戶端代碼如下:

package com.morris.udp.bio.single;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;public class Client { public static void main(String[] args) throws IOException { DatagramSocket datagramSocket = new DatagramSocket(); byte[] req = 'hello server'.getBytes(); DatagramPacket datagramPacket = new DatagramPacket(req, req.length, new InetSocketAddress('127.0.0.1', 9999)); datagramSocket.send(datagramPacket); datagramSocket.receive(datagramPacket); System.out.println('receive from server: ' + new String(datagramPacket.getData())); }}

客戶端和服務端的代碼幾乎一致,只不過接收和發送數據的順序不一致,receive和send都歐式阻塞方法。

bio之廣播

廣播:同一網段所有主機都能接收,前提是端口要開啟監聽。

只需要將單播的例子中客戶端發送數據的IP修改為255.255.255.255即可,具體修改如下:

DatagramPacket datagramPacket = new DatagramPacket(req, req.length, new InetSocketAddress('255.255.255.255', 9999));bio之多播(組播)

多播數據報套接字類用于發送和接收IP多播包。MulticastSocket是一種DatagramSocket,它具有加入Internet上其他多播主機的“組”的附加功能。

多播組通過D類IP地址和標準UDP端口號指定。D類IP地址在224.0.0.0和239.255.255.255的范圍內。地址224.0.0.0被保留,不應使用。

可以通過首先使用所需端口創建MulticastSocket,然后調用joinGroup(InetAddress groupAddr)方法來加入多播組。

服務器端代碼如下:

package com.morris.udp.bio.multicast;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.MulticastSocket;public class Server { public static void main(String[] args) throws IOException { InetAddress group = InetAddress.getByName('228.5.6.7'); MulticastSocket s = new MulticastSocket(6789); s.joinGroup(group); byte[] buf = new byte[1000]; DatagramPacket recv = new DatagramPacket(buf, buf.length); s.receive(recv); System.out.println('receive : ' + new String(buf)); s.leaveGroup(group); }}

客戶端代碼如下:

package com.morris.udp.bio.multicast;import java.io.IOException;import java.net.*;public class Client { public static void main(String[] args) throws IOException { String msg = 'Hello'; InetAddress group = InetAddress.getByName('228.5.6.7'); MulticastSocket s = new MulticastSocket(); s.joinGroup(group); DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 6789); s.send(hi); s.leaveGroup(group); }}NIO實現單播

服務器端代碼如下:

package com.morris.udp.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.net.SocketAddress;import java.nio.ByteBuffer;import java.nio.channels.DatagramChannel;public class Server { public static void main(String[] args) throws IOException { DatagramChannel datagramChannel = DatagramChannel.open(); datagramChannel.bind(new InetSocketAddress(9999)); // datagramChannel.configureBlocking(false); ByteBuffer byteBuffer = ByteBuffer.allocate(128); SocketAddress receive = datagramChannel.receive(byteBuffer); byteBuffer.flip(); byte[] bytes = new byte[byteBuffer.remaining()]; byteBuffer.get(bytes); System.out.println('receive from client: ' + new String(bytes)); byteBuffer.clear(); byteBuffer.put('hello client'.getBytes()); datagramChannel.send(byteBuffer, receive); }}

客戶端代碼如下:

package com.morris.udp.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.net.SocketAddress;import java.nio.ByteBuffer;import java.nio.channels.DatagramChannel;public class Client { public static void main(String[] args) throws IOException { DatagramChannel datagramChannel = DatagramChannel.open(); // datagramChannel.configureBlocking(false); String req = 'hello server'; ByteBuffer byteBuffer = ByteBuffer.allocate(req.length()); byteBuffer.put(req.getBytes()); byteBuffer.flip(); datagramChannel.send(byteBuffer, new InetSocketAddress('127.0.0.1', 9999)); datagramChannel.receive(byteBuffer); byteBuffer.flip(); byte[] bytes = new byte[byteBuffer.remaining()]; byteBuffer.get(bytes); System.out.println('receive from server: ' + new String(bytes)); }}Netty實現單播

服務器端代碼如下:

package com.morris.udp.netty.single;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelOption;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.DatagramPacket;import io.netty.channel.socket.nio.NioDatagramChannel;import io.netty.util.CharsetUtil;public class Server { private static final int port = 8899; public static void main(String[] args) throws InterruptedException { NioEventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioDatagramChannel.class) .handler(new SimpleChannelInboundHandler<DatagramPacket>() { @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { // 接收數據 System.out.println(msg.content().toString(CharsetUtil.UTF_8)); // 發送數據 ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer('hello client', CharsetUtil.UTF_8), msg.sender())); ctx.close(); } }); bootstrap.bind(port).sync().channel().closeFuture().await(); } finally { group.shutdownGracefully(); } }}

客戶端代碼如下:

package com.morris.udp.netty.single;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.Unpooled;import io.netty.channel.Channel;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelOption;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.DatagramPacket;import io.netty.channel.socket.nio.NioDatagramChannel;import io.netty.util.CharsetUtil;import java.net.InetSocketAddress;public class Client { public static void main(String[] args) throws InterruptedException { NioEventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioDatagramChannel.class) .handler(new SimpleChannelInboundHandler<DatagramPacket>() { @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { // 接收數據 System.out.println(msg.content().toString(CharsetUtil.UTF_8)); ctx.close(); } }); Channel channel = bootstrap.bind(0).sync().channel(); // 發送數據 channel.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer('hello server', CharsetUtil.UTF_8), new InetSocketAddress('127.0.0.1', 8899))); if (!channel.closeFuture().await(30 * 1000)) { System.err.println('查詢超時'); } } finally { group.shutdownGracefully(); } }}Netty實現廣播

只需要將netty實現的單播的客戶端代碼做如下修改:

1.增加option:

.option(ChannelOption.SO_BROADCAST, true)

2.將IP地址修改為廣播地址255.255.255.255:

channel.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer('hello server', CharsetUtil.UTF_8), new InetSocketAddress('255.255.255.255', 8899)));底層實現

recvfrom負責接收UDP數據,其函數聲明如下:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

sendto負責發送UDP數據,其函數聲明如下:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

下面通過對bio之單播的例子所產生的系統調用進行跟蹤:

啟動服務器端服務Server:

# strace -ff -o out java Server

然后使用nc命令充當客戶端進行連接:echo hello | nc -uv 127.0.0.1 9999。

產生的系統調用中關鍵信息如下:

socket(AF_INET6, SOCK_DGRAM, IPPROTO_IP) = 4bind(4, {sa_family=AF_INET6, sin6_port=htons(9999), inet_pton(AF_INET6, '::', &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, 28) = 0recvfrom(4, 'hellon', 1024, 0, {sa_family=AF_INET6, sin6_port=htons(7361), inet_pton(AF_INET6, '::ffff:127.0.0.1', &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, [28]) = 6write(1, 'receive from client: hellon00000'..., 1045) = 1045write(1, 'n', 1) sendto(4, 'hello client', 12, 0, {sa_family=AF_INET6, sin6_port=htons(7361), inet_pton(AF_INET6, '::ffff:127.0.0.1', &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, 28) = 12

可見發送和接收數據確實使用了上面的系統調用,另外上面的系統調用中并沒有listen函數,不需要監聽端口,再次驗證UDP是面向無連接的。

到此這篇關于詳解UDP協議格式及在java中的使用的文章就介紹到這了,更多相關java中使用UDP協議內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩国产欧美一区二区| 激情综合网址| 蜜臀久久99精品久久久画质超高清| 特黄特色欧美大片| 欧洲av一区二区| 欧美91视频| 亚洲精品极品少妇16p| 亚洲综合精品| 国产亚洲欧洲| 亚洲精品日韩久久| 日本视频在线一区| 国产一区 二区| 国产精品一页| 国产一区二区色噜噜| 福利在线免费视频| 99视频精品全部免费在线视频| 狠狠爱www人成狠狠爱综合网| 亚洲二区三区不卡| 一本色道久久精品| 亚洲无线观看| 日韩av一级片| 国产精品久久乐| 四虎8848精品成人免费网站| 亚洲最新无码中文字幕久久| 欧美1区2区3区| 亚洲精品裸体| 欧美1区2区3| 精品欧美一区二区三区在线观看| 伊人影院久久| 青青草国产精品亚洲专区无| 福利视频一区| 99视频精品免费观看| 亚洲精品一二| 精品九九久久| 欧美日韩高清| 91在线成人| av一区在线| 亚洲一级大片| 精品国产一区二| 亚洲欧美伊人| 国产欧美一区二区三区米奇| 国产日韩电影| 蜜臀av亚洲一区中文字幕| 国产欧美日韩精品一区二区三区| 黄色aa久久| 夜夜嗨av一区二区三区网站四季av| 国产亚洲一卡2卡3卡4卡新区| 日韩欧美精品综合| 亚洲bt欧美bt精品777| 91亚洲国产高清| 蜜桃久久久久久| 国产成人精品福利| 美女精品网站| 久久香蕉精品香蕉| 国产视频一区三区| 精品国产乱码| 亚洲午夜免费| 日韩欧美不卡| 国产精品一区免费在线| 亚洲先锋成人| 国产精品一区二区免费福利视频| 亚洲天堂成人| 国产精品午夜一区二区三区| 午夜国产欧美理论在线播放| 欧美日一区二区三区在线观看国产免 | 日韩综合小视频| 超级白嫩亚洲国产第一| 老牛影视一区二区三区| 国产成人a视频高清在线观看| 日韩在线卡一卡二| 日韩专区精品| 国产精品久久久久久模特| 宅男在线一区| 国产videos久久| 日韩午夜视频在线| 国产91一区| 精品在线网站观看| 日本亚洲欧洲无免费码在线| 女人av一区| 国产一级成人av| 亚洲综合图色| 自拍日韩欧美| 日韩一区二区三区免费播放| 欧美韩一区二区| 天海翼精品一区二区三区| 欧美日韩在线二区| 激情综合五月| 国产亚洲一区二区三区啪| 久久亚洲欧美| 久久精品国产68国产精品亚洲| 国产成人在线中文字幕| 国产欧美综合一区二区三区| 男人的天堂亚洲一区| 99久久久久国产精品| 久久精品九色| 国产欧美69| 婷婷综合国产| 国产婷婷精品| 亚洲成人日韩| 亚洲调教视频在线观看| 日韩免费福利视频| 国产伦久视频在线观看| 麻豆中文一区二区| 国产香蕉精品| 日韩福利视频导航| 日韩中文字幕一区二区三区| 激情自拍一区| 亚洲福利久久| 日韩精品1区| 国产一区二区三区天码| 美女精品久久| 久久精品国产精品亚洲毛片| 国产日韩一区二区三区在线| 日韩精品一级| 日本伊人午夜精品| 亚洲最新av| 亚洲开心激情| 蜜桃视频在线观看一区| 日韩在线一区二区| 免费在线观看一区二区三区| 性色av一区二区怡红| 亚洲成人日韩| 欧美综合二区| 香蕉精品999视频一区二区| 蜜桃成人av| 日韩午夜高潮| 久久都是精品| 蜜桃久久精品一区二区| 综合国产在线| 日韩高清电影一区| 欧美日本久久| 国产精品v一区二区三区| 国产精品久久久久久久久久白浆 | 久久国产欧美| 日韩欧美午夜| 亚洲香蕉网站| 香蕉精品999视频一区二区| 蜜臀精品一区二区三区在线观看 | 日韩和欧美一区二区| 国产日韩欧美三区| 国产精品v日韩精品v欧美精品网站| 国产精品草草| 福利一区和二区| 国产综合视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 午夜久久av| 久久99久久人婷婷精品综合| 国产成人精品亚洲线观看| 中文字幕系列一区| 99香蕉国产精品偷在线观看| 亚洲网址在线观看| 国产激情欧美| 韩国精品主播一区二区在线观看| 婷婷亚洲五月色综合| 免费一区二区视频| 久久国产免费看| av免费不卡国产观看| 亚洲欧美日韩精品一区二区| 欧美日韩夜夜| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 青青草91久久久久久久久| 欧美精品导航| 久久精品国产亚洲夜色av网站 | 国产综合精品| 少妇精品久久久| 国产aa精品| 午夜久久美女| 日韩av中文字幕一区二区三区| 精品美女在线视频| 自拍日韩欧美| 国产精品17p| 欧美成人久久| 欧美一区二区三区久久精品| 伊人网在线播放| 日本欧美在线看| 荡女精品导航| 蜜臀91精品一区二区三区| 久久69成人| 尹人成人综合网| 国产香蕉精品| 欧美日韩黑人| 国产亚洲欧美日韩在线观看一区二区| 日本а中文在线天堂| 国产亚洲在线观看| 国产精品一卡| 黄色日韩精品| 久久精品国产99| 亚洲在线久久| 精精国产xxxx视频在线播放| 日韩精品亚洲专区| 久久久久久免费视频| 久久国产尿小便嘘嘘| 免费毛片在线不卡| 精品网站999| 亚洲精品在线国产| 欧洲精品一区二区三区| 亚洲精品一级| 久久三级福利| 捆绑调教美女网站视频一区 | 日韩精品电影一区亚洲|