简单聊一下TCP、UDP网络通信

本文介绍了UDP和TCP两种网络协议的基本概念,强调了它们在无连接和有连接、效率与数据完整性的区别,并通过Java代码示例展示了UDP的简单聊天和TCP的多线程聊天以及文件下载应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是UDP?

UDP是用户数据报协议,它是面向无连接的通信协议,什么叫无连接?它不需要客户端和服务端建立连接,简单来讲,我发送一个图片给你,不需要你来连接我,我自己指定端口号和IP地址发送给你,我发送完后我就不管了,你数据丢了或者说图片不清晰都不关我的事,我已经发了这个请求给你了,剩下的与我无关。

2.什么是TCP?

TCP是传输控制协议,面向有连接的协议,当客户端与服务端连接成功后,才可以开始传输数据,而且TCP传输数据是完整的,但是效率不高。

3.TCP和UDP的各自特点

UDP:面向无连接的,传输效率高,但是传输数据不完整,很容易丢包,适用于实时性较强的场景,例如直播,语音聊天等等。

TCP:面向有连接的,传输效率低(每次连接都需要三次握手,每次断开连接都需要四次挥手),传输数据完整,不会丢失数据,适用于实时性不高的场景,例如文件上传,图片上传等等。

4.java实现UDP小案例

案例1:客服端发送数据,服务端响应数据

public class Test14_UDP客户端 {
    public static void main(String[] args) throws Exception{
        //创建一个UDP报文
        DatagramSocket socket=new DatagramSocket();
        //封装一个UDP报文
        byte [] data=new byte[8192];
        DatagramPacket packet=new DatagramPacket(data,data.length, InetAddress.getByName("localhost"),8080);
        // 设置UDP报文的数据
        packet.setData("你好".getBytes());
        packet.setLength("你好".getBytes().length);
        socket.send(packet);

    }
}
public class Test15_UDP服务端 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket=new DatagramSocket(8080);
        byte [] data=new byte[8192];
        DatagramPacket packet=new DatagramPacket(data,data.length);
        socket.receive(packet);
        socket.close();
        System.out.println("接收到了数据:"+new String(data,0,packet.getLength()));
    }
}
接收到了数据:你好

5.java实现TCP小案例

案例1:多线程实现建立客户端和服务端,来回聊天

public class Test16_TCP多线程聊天1 {
    private static Socket socket;
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        socket=socket =new Socket("localhost",8080);
        //写数据
        new Thread(() -> {
            try {
                OutputStream os = socket.getOutputStream();
               while (true){
                   String s = sc.nextLine();
                   os.write(s.getBytes());
               }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
        //读数据
        new Thread(() -> {
            try {
                int len;
                byte[] bytes = new byte[8192];
                InputStream is = socket.getInputStream();
               while (true){
                   while ((len = is.read(bytes)) != -1) {
                       System.out.println("收到回复是:"+new String(bytes,0,len));
                   }
               }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}
public class Test17_TCP多线程聊天2 {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        ServerSocket serverSocket=new ServerSocket(8080);
        Socket socket = serverSocket.accept();
        //写数据
        new Thread(() -> {
            try {
                OutputStream os = socket.getOutputStream();
              while (true){
                  String s = sc.nextLine();
                  os.write(s.getBytes());
              }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }).start();
        //读数据
        new Thread(() -> {
            try {
                int len;
                byte[] bytes = new byte[8192];
                InputStream is = socket.getInputStream();
               while (true){
                   while ((len = is.read(bytes)) != -1) {
                       System.out.println("收到回复是:"+new String(bytes,0,len));
                   }
               }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

 

            

案例2:复制图片,客户端连接成功后,服务端返回一张图片,客户端接收并存入磁盘

 

public class Test12_文件下载服务端 {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(8080);
        Socket socket = serverSocket.accept();
        OutputStream os = socket.getOutputStream();
        FileInputStream fis=new FileInputStream("F:/2.webp");
        int len;
        byte [] bytes=new byte[8192];
        while ((len=fis.read(bytes))!=-1){
            os.write(bytes,0,len);
        }
    }
}
public class Test11_文件下载客户端 {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("localhost",8080);
        InputStream is = socket.getInputStream();
        FileOutputStream fos=new FileOutputStream("F:/copy.webp");
        int len;
        byte[] bytes=new byte[8192];
        while ((len=is.read(bytes))!=-1){
                fos.write(bytes,0,len);
        }
        System.out.println("文件下载成功");
        fos.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值