⑴ java中如何完成UDP包的封装
给你一段代码,或许可以帮到你……public class SendSideTest {/*发送数据 */public static void main(String[] args) throws IOException {//1 DatagramSocket是用来接收发送数据的DatagramSocket ds = new DatagramSocket();//2 发送什么byte[] s="helloabcdef".getBytes();//3 发送到哪,发送到本机InetAddress clientAddress=InetAddress.getLocalHost();//4 搭建一个outDataPacket相当于一个邮包//把发送的内容,发送的地址,发送的端口,写在邮包上DatagramPacket op = null;op=new DatagramPacket(s, s.length,clientAddress, 9999);//5 通过一个DatagramPacket将数据发送到客户端,//客户端的地址由DatagramPacket指定,即写在邮包上ds.send(op);System.out.println("数据已经成功发送");}}public class ReceiveSideTest {/* 接收方*/public static void main(String[] args) throws IOException {//1 DatagramSocket相当于建立一个服务器 在9999监听DatagramSocket ds = new DatagramSocket(9999);//2 DatagramPacket是用来接收发送的数据的 要有容器接收byte[] msg = new byte[100]; DatagramPacket ip = new DatagramPacket(msg, msg.length); //3调用receive方法接收数据到DatagramPacket 中//数据又由DatagramPacket放入msgds.receive(ip);String msgs = new String(msg);System.out.println(msgs);//4通过DatagramPacket得到地址和端口 把发送者打印出来InetAddress clientAddress = ip.getAddress();int clientPort = ip.getPort();System.out.println("发送者:"+clientAddress);System.out.println("发送端口:"+clientPort);}}
⑵ Java udp如何通过一个对象完成接收和发送数据
//注意,本地ip以及端口,广播Ip以及端口,可根据自己的电脑实际情况定.我的三段是2//思路:我用的udp启动服务端,进行侦听,如果有消息,就该频段广播一次..//客户端使用多线程,一个发送服务端,一个接受广播..就当我复习了一次…!importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.InetSocketAddress;importjava.net.SocketAddress;importjava.util.Scanner;publicclassUdpTest{classSendTest{privateintcount=1;privateScannersc;privatebyte[]by,by2;privateInetAddressip;privateSocketAddresssd1,sd2;privateDatagramSocketds,ds2;privateDatagramPacketdp,dp2;SendTest(StringipName,intport)throwsException{sc=newScanner(System.in);ip=InetAddress.getByName(ipName);sd1=newInetSocketAddress(ip,port);//发送的目标:ip+端口sd2=newInetSocketAddress(19823);//己方,省略ip,默认自己本地地址ds=newDatagramSocket();//参数为自己的标识//接受by2=newbyte[1024];ds2=newDatagramSocket(sd2);send();}privatevoidsend()throwsIOException{newThread(){publicvoidrun(){while(true){by=sc.nextLine().getBytes();dp=newDatagramPacket(by,by.length,sd1);//数组,数组长度,目标ip+端口try{ds.send(dp);}catch(IOExceptione){e.printStackTrace();}//推送服务;System.out.println("老马第:"+count+++"条信息发送完成!");}}}.start();newThread(){publicvoidrun(){while(true){dp2=newDatagramPacket(by2,by2.length);try{ds2.receive(dp2);System.out.println("老马接受到一条广播可能来自老宋:"+newString(by2,0,dp2.getLength()));}catch(IOExceptione){e.printStackTrace();}}}}.start();}}classAccepTest{privatebyte[]by;privateSocketAddresssd1,sd2;privateDatagramSocketds;privateDatagramPacketdp;privateintcount=0;AccepTest()throwsException{by=newbyte[1024];sd1=newInetSocketAddress("192.168.2.255",19823);//广播sd2=newInetSocketAddress(19822);//己方,省略ip,默认自己本地地址ds=newDatagramSocket(sd2);//参数为自己的标识,这是用来接受的…..accepts();}privatevoidaccepts()throwsIOException{while(true){count++;System.out.println("老宋的服务器接受第:"+count+"次数据:…");dp=newDatagramPacket(by,by.length);//数组,数组长度,仅仅用来接收;ds.receive(dp);//接受服务;Stringstr=newString(by,0,dp.getLength());System.out.println("老宋接受到数据———>"+str);System.out.println();//广播..by=("插个广播:"+str+"….谁发的??").getBytes();dp=newDatagramPacket(by,by.length,sd1);ds.send(dp);}}}publicstaticvoidmain(String[]args)throwsException{newThread(){publicvoidrun(){try{newUdpTest().newAccepTest();}catch(Exceptione){e.printStackTrace();}}}.start();newThread(){publicvoidrun(){try{newUdpTest().newSendTest("127.0.0.1",19822);}catch(Exceptione){e.printStackTrace();}}}.start();}}
⑶ Java的写的UDP发包,有什么办法可以扩大UDP的发送量
网络的承受,本来就是有限的,这么大的一包、不分包,很容易出错。你如果了解TCP/IP通讯的原理就清楚,其实TCP/IP包的大小是有限制的
⑷ TCP,UDP接收一次数据包的 最大限度怎么设置
我写了个TCP,和UDP类发现TCP默认接收的最大缓冲 一次性好象最多只能接收 12000左右个字节而UDP默认接收的最大缓冲 一次性好象最多只能接收 28000左右个字节据说一般最好。65535个以下 ,否则路由器容易丢包——解决方案——————————————————–private int _buf=8000;//标记一次传输文件数据块的大小,不能超过MTU限制,否则在因特网上的数据发送将不成功00[Category( "全局设置 ")][Description( "设置UDP每一次传输数据包的大小 ")][DefaultValue(8000)]public int buf{set{_buf=value;}get{return _buf;}}然后使用 byte[] 发送数据,发送的时候限制每一次包大小。至于接收:如果你发送的包已经限制好,接收就不会出问题。byte[] buffer = new byte[buf];——解决方案——————————————————–这个理论是错的吧,本身SEND发送出去,RECEIVE收的时候是分很多次收的.看网络情况而定,每次接收的大小这个是不能确定的.——解决方案——————————————————–IO读取操作好像有读取的字节数,buffer400读取300的时候,会返回一个300,然后检查返回值,不够继续读取,读取的时候也可以选择要在buffer的哪个部分开始接收——解决方案——————————————————–和发送放有关系吧设置一个不是很大的缓冲区,1024-2048(为了效率啊`~太大很浪费内存的)1。找一个结束标志,一般几个字节。重点来了!这几字节很可能会接收的内容重复,所以检测这个标志很麻烦。所以接收到这个标志的时间再看后面是不是全是02。如果发送方可以控制。开头用两个到四位标注出整个数据包的长度。
⑸ 怎么实现UDP数据包的拆包组包发送与接收
如果你个人计算机用户,接受的数据包应该比发送的数据包大几十倍才正常(根据用户使版用计算机时间长权短决定)。因为大家平时浏览网页、下载软件等都不需要发送多少数据,而主要是接受。如果普通计算机用户发送数据包多于收到的那就要提起警惕了。
⑹ JAVA用udp从本地网络穿透到公网之后,从其他网络作为客户端发送udp包到服务器正常接收。
你说的还不清楚。Java网络编程使用Socket,同为一个网络下的主机时是肯定没问题的,不论同一局域网或专广属域网。如果内网跨越网关,我没做过试验,按我的理解,内网主机做客户端,独立主机做服务器应该可行,反之不行。
⑺ java 怎么用UDP实时接收数据
我自己写的代码: importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketException;importjava.net.UnknownHostException;publicclassUdpRecvDemo{publicstaticvoidmain(String[]args)throwsIOException{Recv();}publicstaticvoidRecv()throwsIOException{System.out.println(“接受开始……”);DatagramSocketds=newDatagramSocket(3388);while(true){byte[]buf=newbyte[1024];DatagramPacketdp=newDatagramPacket(buf,buf.length);ds.receive(dp);System.out.println(ds);Stringip=dp.getAddress().getHostAddress();intport=dp.getPort();Stringtext=newString(dp.getData(),0,dp.getLength());if(text.equals(“exit”)){System.out.println(ip+”退出会话……”);break;}System.out.println(ip+”:”+port+”===>me”+text);}ds.close();}}
⑻ JAVA UDP通信为什么只能接收一次数据,我想要时刻接收数据,并更新UI,大神们帮我看看程序吧
开始是使用new udpReceiveThread()。。。。。。。。。终止也是使用new udpReceiveThread()操作的是完全不同的一个线程 了
⑼ java DatagramSocket receive 方法 接收 多个包
多线程,用一个线程监听,如果接到包,创建一个线程处理,继续监听。保证一直有一个线程在监听就可以了。