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

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

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

瀏覽:296日期: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久久,三上悠亚国产精品一区二区三区
电影91久久久| 国内精品99| 免费久久99精品国产自在现线| 激情综合在线| 在线亚洲成人| 亚洲精品无吗| 欧美成a人片免费观看久久五月天| 精品久久久网| 亚洲成人不卡| 亚洲欧美伊人| 亚洲精品在线国产| 欧美精品影院| 日韩欧美视频专区| 日韩国产在线| 99pao成人国产永久免费视频| 亚洲1区在线观看| 精品一区二区三区视频在线播放| 日韩不卡免费高清视频| 在线亚洲欧美| 国产精品欧美日韩一区| 欧美日韩国产观看视频| 亚洲少妇在线| 欧美激情视频一区二区三区在线播放| 在线看片国产福利你懂的| 欧美日韩视频| 欧美国产极品| 夜夜嗨网站十八久久| 国产极品一区| 激情欧美一区二区三区| 日韩欧美在线精品| 都市激情国产精品| 妖精视频成人观看www| 国产精品极品| 好看不卡的中文字幕| 国产亚洲精品美女久久久久久久久久| 色婷婷色综合| 亚洲资源网站| 日韩一区三区| 欧美午夜不卡影院在线观看完整版免费| 日本不卡一区二区| 久久精品123| 国产视频网站一区二区三区| 黄色在线观看www| 蜜桃视频一区二区三区在线观看| 精品国产乱码久久久| 蜜臀精品久久久久久蜜臀| 91亚洲一区| 日韩和欧美一区二区| 成人羞羞视频播放网站| 18国产精品| 夜夜嗨一区二区| 四虎成人av| 欧美日韩中出| 日韩精品一二区| 99久久婷婷这里只有精品| 国产精品一区二区中文字幕| 中文日韩在线| 欧美日韩精品一区二区视频| 欧美日韩va| 99热免费精品| 99久久精品网| 91亚洲自偷观看高清| 国产丝袜一区| 亚洲人妖在线| 欧美日韩四区| 免费一二一二在线视频| 国产精久久久| 国产欧美在线| 日韩在线观看一区二区三区| 中文久久精品| 欧美影院三区| 99久久亚洲精品蜜臀| 国产一区二区三区亚洲综合| 日韩在线观看一区二区三区| 欧美网站在线| 亚洲高清二区| 天堂资源在线亚洲| 日韩一区自拍| 国产在线观看www| 国产成人精选| 精品久久美女| 麻豆视频在线观看免费网站黄| 美日韩一区二区三区| 欧美日韩一区二区三区四区在线观看 | 亚洲精品99| 欧产日产国产精品视频| 高清av一区| 日本aⅴ亚洲精品中文乱码| 亚洲伊人精品酒店| 欧美精品自拍| 91久久亚洲| 爽爽淫人综合网网站| 久久国产精品毛片| 石原莉奈在线亚洲二区| 老司机精品久久| 亚洲一区二区免费在线观看| 日韩制服丝袜av| 一区二区三区四区在线观看国产日韩| 亚洲性图久久| 亚洲经典在线| 视频在线观看91| 中文在线日韩| 青青在线精品| 国产日产精品_国产精品毛片| 国产调教精品| 美女毛片一区二区三区四区最新中文字幕亚洲 | 天堂久久av| 欧美永久精品| 国产香蕉精品| 久久久久九九精品影院| 精品一区二区三区视频在线播放| 国产在线一区不卡| 色综合www| 伊人久久亚洲美女图片| 美女精品在线观看| 日本一区二区中文字幕| 日本少妇精品亚洲第一区| 国产精品中文| 91av亚洲| 欧美女激情福利| 日韩高清在线观看一区二区| 日本高清久久| 麻豆国产欧美一区二区三区| 美女国产精品久久久| 成人亚洲欧美| 久久国产精品99国产| 欧美一区免费| 丝袜诱惑一区二区| 99国产精品久久久久久久| 97久久超碰| 美女网站视频一区| 亚洲一区二区三区在线免费| 国产亚洲精品美女久久| 高清日韩欧美| 夜久久久久久| 久久精品凹凸全集| 久久久一本精品| 综合激情视频| 日本国产一区| 蜜臀久久精品| 日韩中文字幕无砖| 国产成人黄色| 亚洲伊人精品酒店| 久草免费在线视频| 日本一区二区三区中文字幕| 97精品国产一区二区三区| 亚洲一级在线| 精品72久久久久中文字幕| 噜噜噜久久亚洲精品国产品小说| 精品淫伦v久久水蜜桃| 国产伦精品一区二区三区视频 | 亚洲黄色免费看| 精精国产xxxx视频在线野外| 亚洲v在线看| 日本亚洲最大的色成网站www| 国产福利91精品一区二区| 欧美专区18| 黄色aa久久| 日本强好片久久久久久aaa| 久久精品国语| 国产精品二区影院| 国产偷自视频区视频一区二区| 欧美aaaaaa午夜精品| 美女毛片一区二区三区四区| 国产精品久久久久久久免费软件| 日韩精品网站| 国产精品久久久久久久久免费高清| 久久蜜桃资源一区二区老牛| 欧美精品观看| 日韩在线观看一区二区| 日韩欧美精品一区| 欧美黑人做爰爽爽爽| 日本成人中文字幕| 国产日产精品_国产精品毛片| 在线一区二区三区视频| 男女激情视频一区| 香蕉人人精品| 影音先锋国产精品| 亚洲国产一区二区三区在线播放| 日韩av自拍| 亚洲专区视频| 日本特黄久久久高潮| 97精品国产99久久久久久免费| 日韩精品一二区| 喷白浆一区二区| 日韩中文字幕不卡| 国产精品v亚洲精品v日韩精品| 国产一区二区三区亚洲综合| 伊人影院久久| 欧美日韩水蜜桃| 日韩天堂在线| 91嫩草亚洲精品| 精品国产一区二区三区噜噜噜| 欧美亚洲tv| 国产精品欧美一区二区三区不卡| 99视频在线精品国自产拍免费观看| 午夜av成人| 亚洲不卡av不卡一区二区| 丝袜美腿诱惑一区二区三区| 久久激五月天综合精品|