「javaudp超长」javaudp发送数据

博主:adminadmin 2022-11-28 00:16:09 62

今天给各位分享javaudp超长的知识,其中也会对javaudp发送数据进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java中UDP文件传输怎么实现?

java UDP连接,如果要发送文件的话,你只能自己定义一系列的协议

因为TCP UDP 双方发送都是二进制数据

那么这个实现非常复杂

得不停的发送数据,写数据,建议使用http协议

如何实现Java udp超时重传机制

udp发送消息后,让另一方给一个回执说他已经收到了,否则认为发送不成功。不过一般的一个流程应该是这样的。A客户端-服务器-B客户端a发一条消息经过服务器,服务器收到后发一条回执给 a与已经收到a发的消息了,让a放心 。

java 中怎么使用UDP?

发送步骤:

使用 DatagramSocket(int port) 建立socket(套间字)服务。

将数据打包到DatagramPacket中去

通过socket服务发送 (send()方法)

关闭资源

import java.io.IOException;  

import java.net.*;  

  

public class Send {  

  

    public static void main(String[] args)  {  

          

        DatagramSocket ds = null;  //建立套间字udpsocket服务  

          

        try {  

          ds = new DatagramSocket(8999);  //实例化套间字,指定自己的port  

        } catch (SocketException e) {  

            System.out.println("Cannot open port!");  

            System.exit(1);   

        }  

          

        byte[] buf= "Hello, I am sender!".getBytes();  //数据  

        InetAddress destination = null ;  

        try {  

            destination = InetAddress.getByName("192.168.1.5");  //需要发送的地址  

        } catch (UnknownHostException e) {  

            System.out.println("Cannot open findhost!");  

            System.exit(1);   

        }  

        DatagramPacket dp =   

                new DatagramPacket(buf, buf.length, destination , 10000);    

        //打包到DatagramPacket类型中(DatagramSocket的send()方法接受此类,注意10000是接受地址的端口,不同于自己的端口!)  

          

        try {  

            ds.send(dp);  //发送数据  

        } catch (IOException e) {  

        }  

        ds.close();  

    }  

}

接收步骤:

使用 DatagramSocket(int port) 建立socket(套间字)服务。(我们注意到此服务即可以接收,又可以发送),port指定监视接受端口。

定义一个数据包(DatagramPacket),储存接收到的数据,使用其中的方法提取传送的内容

通过DatagramSocket 的receive方法将接受到的数据存入上面定义的包中

使用DatagramPacket的方法,提取数据。

关闭资源。

import java.net.*;  

  

public class Rec {  

  

    public static void main(String[] args) throws Exception {  

          

        DatagramSocket ds = new DatagramSocket(10000);  //定义服务,监视端口上面的发送端口,注意不是send本身端口  

          

        byte[] buf = new byte[1024];//接受内容的大小,注意不要溢出  

          

        DatagramPacket dp = new DatagramPacket(buf,0,buf.length);//定义一个接收的包  

          

        ds.receive(dp);//将接受内容封装到包中  

          

        String data = new String(dp.getData(), 0, dp.getLength());//利用getData()方法取出内容  

          

        System.out.println(data);//打印内容  

          

        ds.close();//关闭资源     

    }  

}

关于java Udp多线程的问题

1,理解正确,几个线程各子锁定自己的同步锁,当然是没有什么用。对于竞争资源,必须锁定同一个锁,你可以new 一个Object用于锁,也可以用class做锁,反正都要是同一个。

2,理解有偏差,其他线程也会被调度,不可能一个线程一直sleep,其他线程都不工作了,影响范围没有那么大,仅限于需要进入同一个同步锁的,它们进不了工作。

所谓占着茅坑不拉shi,就是这个状态了。

3,多线程的好处是充分利用CPU的资源,实现并发。例如你说的通讯,往往是花百分之几的时间CPU处理数据,剩下的绝大部分时间,都是在等待网络数据。使用多线程可以充分利用这段时间。

关于java UDP文件传输的问题

使用UDP协议进行文件传输不能保证正确性,很容易发生丢包的情况。建议在进行较大文件传输的时候使用TCP的Socket和ServerSocket类进行传输。在数据量小于65600字节的时候使用UDP是安全的

如果一定要使用UDP方式进行传输的话,为了提高传输的准确性,可以限制一下传输速度,方法是在发送端每次发送后sleep一下,即在发送端程序的dataSocket.send(dataPacket);一句后加上:

TimeUnit.MICROSECONDS.sleep(1);

不过这种方法也不能保证传输绝对准确,所以还是建议用TCP的方式

程序本身应该是能够达到效果的,不知道错误提示是什么。测试之前要看下发送端的filePath文件是否存在,貌似防火墙也有影响,测试之间最好关闭防火墙。下面是我的测试程序,接收端是类A1,接收端是类A2,发送端的文件filePath是D盘根目录下的a1.mkv:

接收端:

import java.io.BufferedOutputStream;

import java.io.DataOutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

public class A1 {

public static DatagramSocket dataSocket;

public static final int PORT=7;

public static byte[] receiveByte;

public static DatagramPacket dataPacket;

public static void main(String[] args) throws IOException{

dataSocket = new DatagramSocket(PORT);

DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\a.mkv"))));

int i = 0;

while (i == 0)// 无数据,则循环

{

receiveByte = new byte[1024];

dataPacket = new DatagramPacket(receiveByte, receiveByte.length);

dataSocket.receive(dataPacket);

i = dataPacket.getLength();

// 接收数据

if (i 0) {

// 指定接收到数据的长度,可使接收数据正常显示,开始时很容易忽略这一点

fileOut.write(receiveByte,0,i);

fileOut.flush();

i = 0;// 循环接收

}

}

}

}

发送端:

import java.io.BufferedInputStream;

import java.io.DataInputStream;

import java.io.FileInputStream;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.Inet4Address;

import java.util.Date;

public class A2 {

public static DatagramSocket dataSocket;

public static final int PORT=7;

public static byte[] sendDataByte;

public static DatagramPacket dataPacket;

public static void main(String[] args) throws IOException, InterruptedException{

String filePath="D:\\a1.mkv";

DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));

dataSocket = new DatagramSocket(PORT+1);

sendDataByte = new byte[1024];

int read=0;

long a=new Date().getTime();

while(true){

if (fis != null) {

read = fis.read(sendDataByte);

}

if (read == -1) {

System.out.println(new Date().getTime()-a);

break;

}

dataPacket = new DatagramPacket(sendDataByte, sendDataByte.length,(Inet4Address) Inet4Address.getByName("localhost"), PORT);

dataSocket.send(dataPacket);

TimeUnit.MICROSECONDS.sleep(1);//限制传输速度

}

}

}

javaudp超长的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于javaudp发送数据、javaudp超长的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-28,除非注明,否则均为首码项目网原创文章,转载请注明出处。