JAVA-UDP传送图片

**UDP传送图片

基于UDP本身特性此处接收端暂时不关闭
如果想要可靠且发送完关闭的请用TCP
UDP的缺陷如下:
一是数据包容易丢失,二是数据包无序
接收端
先启动接收端 再开启发送端 接收结果等发送端发送之后关闭接收端即可查看

package day15_18;

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Demo02_UdpReceive {
    public static void main(String[] args) throws Exception {
        //创建socket对象
        DatagramSocket ds = new DatagramSocket(10086);
        //创建文件要保存的位置 1.jpg是自己写的到达桌面上必须有个类型一样的接收即使你桌面上没有 1.jpg也要写在这里
        FileOutputStream fos = new FileOutputStream("C:\\Users\\阿云\\Desktop\\1.jpg");
        //打包
        DatagramPacket dp = new DatagramPacket(new byte[1024 * 8], 1024 * 8);

        try {
            while (true) {
                ds.receive(dp);
                byte[] date = dp.getData();
                int length = dp.getLength();
                fos.write(date, 0, length);
            }
        } catch (IOException e) {
            ds.close();
        }
        fos.close();
        
        }
    }
}
        //while循环接收 坏处不知道什么时候停止异常处理的不是很完美 这里假设最后一组大小不是8192 如果
        //是8192的话先采取下面的抛异常处理 等待后续知识更新
       /* while (true) {
            ds.receive(dp);
            byte[] date = dp.getData();
            int length = dp.getLength();
            System.out.println(length);
            if (length!=8192){
                ds.close();
                fos.close();
                break;
            }
            fos.write(date, 0, length);
        */

发送端

package day15_18;

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//DUP发送端
public class Demo02_UdpSent {
    public static void main(String[] args) throws Exception {
        //创建发送端socket对象
        DatagramSocket ds = new DatagramSocket();
        //创建字节输入流读取本地文件--填写你要传东西的地址这里的图片我是放在桌面 
        InputStream is=new FileInputStream("C:\\Users\\阿云\\Desktop\\壁纸\\1.jpg");
        //传输动作--先进行while判断是否还有字节再进行不断传输字节流相关知识
        byte[] bys = new byte[1024 * 8];
        int len;
        while ((len = is.read(bys)) != -1) {
            //将数据不断打包进行发送 依次传入数组 数组范围 地址 端口号
            DatagramPacket dp = new DatagramPacket(bys, 0, len, InetAddress.getByName("127.0.0.1"), 10086);
            //socket 对象发送内容
            ds.send(dp);
        }
        //发送完关闭
        is.close();
        ds.close();
    }
}
好的,这是一个比较复杂的问题,需要分别说明 TCP 和 UDP 协议下的实现方式。 1. 通过 TCP 协议实现多人聊天和点对点通信 TCP 协议是一种面向连接的协议,通信双方需要先建立连接,然后才能进行数据传输。在实现多人聊天和点对点通信时,我们可以采用客户端/服务器模型的方式来实现。具体的实现方式如下: 服务器端: - 创建一个 ServerSocket 对象,绑定到指定的端口上; - 使用 accept() 方法监听客户端的连接请求,并为每个连接创建一个新的线程; - 在每个线程中,使用输入流读取客户端发送过来的数据,然后使用输出流将数据发送给其他客户端。 客户端: - 创建一个 Socket 对象,连接到服务器端; - 使用输入流读取服务器端发送过来的数据,然后使用输出流将数据发送给服务器端。 这样,服务器端就可以实现多人聊天,而客户端之间也可以通过服务器端进行点对点通信。 2. 通过 UDP 协议实现多人聊天和点对点通信 UDP 协议是一种无连接的协议,通信双方不需要建立连接,直接进行数据传输。在实现多人聊天和点对点通信时,我们可以采用广播和单播的方式进行实现。具体的实现方式如下: 服务器端: - 创建一个 DatagramSocket 对象,绑定到指定的端口上; - 使用 receive() 方法接收客户端发送过来的数据; - 如果是广播数据,则使用 DatagramPacket 对象将数据发送给所有客户端; - 如果是单播数据,则根据目标地址使用 DatagramPacket 对象将数据发送给指定客户端。 客户端: - 创建一个 DatagramSocket 对象,连接到服务器端; - 使用 receive() 方法接收服务器端发送过来的数据。 这样,服务器端就可以实现多人聊天和点对点通信,而客户端之间也可以通过服务器端进行点对点通信。注意,使用 UDP 协议进行通信时,由于没有建立连接,因此需要考虑丢包、重复包等问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值