Socket套接字之UDP网络编程 单向 双向 异常处理 基于UDP实现两人正常通信

本文详细介绍了如何使用Java的Socket套接字进行UDP网络编程,包括单向通信、双向通信的过程及异常处理机制,提供了具体的接收方和发送方示例,强调了通信顺序和异常处理的重要性。
摘要由CSDN通过智能技术生成

Socket套接字之UDP网络编程 单向 双向 异常处理

套接字(Socket)
  • 用来描述IP地址和端口,是通信链的句柄,应用程序通过Socket向网络发送请求或者应答网络请求
  • 是支持TCP/IP协议的网络通信的基本操作单元,
  • 是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象,内含五种信息:连接使用的协议,本机IP即进程接口PORT,远程主机IP及进程接口PORT。
  • 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
  • 从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。

Socket示意图

Socket通讯模型

UDP

UDP是基于IP的简单协议,不可靠的协议。没有流控制,没有应答确认机制,也不能解决丢包、重发、错序问题;但也因此更加的简单,轻量化。它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。发送方和接收方的地址是平等的。

发送方:DatagramSocket 发送:数据包 DatagramPacket
接收方:DatagramSocket 接收:数据包 DatagramPacket

DatagramPacket构造器及方法:

构造器

  • DatagramPacket(byte[] buf, int length)

构造数据报包,用来接收长度为 length 的数据包

  • DatagramPacket(byte[] buf, int length, InetAddress address, int port)

构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号

方法

  • InetAddress getAddress()

    • 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
  • byte[] getData()

    • 返回数据缓冲区。
  • int getLength()

  • 返回将要发送或接收到的数据的长度。

  • int getPort()

    • 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

接下来是UDP通信实例,暂不处理异常,直接抛出甩锅,运行时先开启接收方再开启发送方,否则会丢包

单向通信

接收方
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Receive {
   
    public static void main(String[] args) throws IOException {
   
        System.out.println("老师上线");
        //1.创建套接字:指定接收方的端口
        DatagramSocket ds = new DatagramSocket(8888);

        //2.有一个空的数据包,打算用来接收对方传过来的数据包:
        byte[] b = new byte[1024];
        DatagramPacket dp = new DatagramPacket(b,b.length);

        //3.接收对方的数据包,然后放入我们的dp数据包中填充
        ds.receive(dp);//接收完以后 dp中便有填充好的内容

        //4.取出数据:
        byte[] data = dp.getData();
        String s = new String(data,0,dp.getLength());//dp.getLength()数组包中的有效长度
        System.out.println("学生对我说:"+s);

        //5.关闭资源:
        ds.close();
    }
}
发送方
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Send {
   
    public static void main(String[] args) throws IOException {
   
        System.out.println("学生上线");
        //1.准备套接字: 指定发送方的端口号
        DatagramSocket ds = new DatagramSocket(8889);

        //2.准备数据包
        String str = "你好";
        byte[] bytes = str.getBytes();
        // DatagramPacket(byte[] 分组数据。 int 包长度。 InetAddress 目的地址。 int 目的端口号)
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("localhost"),8888);

        //发送:
        ds.send(dp);
        System.out.println("已发送");
        //关闭资源
        ds.close();
    }
}
通信过程
Send:
学生上线
已发送

Receive:
老师上线
学生对我说:你好

双向通信

接收方
public class Receive {
   
    public static void main(String[] args) throws IOException {
   
        System.out.println("老师上线");
        //1.创建套接字:指定接收方的端口
        DatagramSocket ds = new DatagramSocket(9999);

        //2.有一个空的数据包,打算用来接收  对方传过来的数据包:
        byte[] b = new byte[1024];
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SK Primin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值