Java网络编程的UDP协议与TCP协议

网络编程是基于网络进行数据传输I(IO流)。

参考模型
在这里插入图片描述

一、UDP协议:

底层基于流,传输不建立连接,不安全(不可靠)但是速度快
适用场景:直播、视频、音频等等
底层根据数据包(64KB)来进行数据传输

1.1发送端

1.创建UDP发送端对象
2.创建数据包(指定IP地址、端口号以及要发送数据)
3.发送数据包
4.关流

public static void main(String[] args) throws IOException {
    //创建UDP发送端的对象
    DatagramSocket ds=new DatagramSocket();
    //创建数据包对象---准备发送数据
    //第一个参数--代表发送的数据
    //第二个参数---代表实际发送内容长度
    //的三个参数---代表IP地址和端口号
    DatagramPacket dp=new DatagramPacket("早上好".getBytes(),"早上好".getBytes().length,new InetSocketAddress("127.0.0.1",8081));
    //发送数据包
    ds.send(dp);

    //关流
    ds.close();
}

1.2接收端

1.创建UDP接收端对象,监听端口号
2.创建数据包(接收发送端发送数据)
3.接收数据包
4.关流
5.解析数据包

public static void main(String[] args) throws IOException {
    //创建UDP接收端对象---监听发送端的端口号
    DatagramSocket ds=new DatagramSocket(8081);
    //创建数据包对象---接收数据
    //第一个参数--代表来接收数据的字节数组
    //第二个参数--代表真实的接收数据内容的长度
    DatagramPacket dp=new DatagramPacket(new byte[1024],1024);

    //接收发送端发送数据
    ds.receive(dp);//会让线程阻塞状态
    //关流
    ds.close();
    //解析数据包
    //返回IP地址
    System.out.println(dp.getAddress());
    //getData--接收到的数据
    //getLength--接收的数据内容的长度
    //展示接收的数据
    System.out.println(new String(dp.getData(),0,dp.getLength()));
}

二、 TCP协议

底层基于流,传输建立连接(三次握手),安全(可靠),传输速度慢
适用场景:上传和下载、聊天等等
底层根据IO流来进行数据传输,不限制传输数据大小

socket中发送的TCP三次握手
在这里插入图片描述

从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN
J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK
J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN
K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。
总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。

socket中发送的TCP四次握手(四次挥手)
在这里插入图片描述

图示过程如下: 某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M; 另一端接收到FIN
M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
接收到这个FIN的源发送端TCP对它进行确认。 这样每个方向上都有一个FIN和ACK。

2.1客户端:

1.创建TCP客户端对象
2.发起连接(指定IP地址和端口号)
3.获取自带字节输出流往服务器端写出数据
4.写出数据
5.通知服务器端数据已经发送完毕
6.关流

public static void main(String[] args) throws IOException {
    //创建 TCP的客户端对象
    Socket s=new Socket();
    //发起连接
    s.connect(new InetSocketAddress("127.0.0.1",9092));//让线程对象阻塞
    //获取自带的字节输出流
    //默认往服务器端来传输
    OutputStream os=s.getOutputStream();
    //写出数据
    os.write("下午好".getBytes());
    //通知服务器端数据已经发送完毕
    s.shutdownOutput();
    //从服务器端来读取数据
    //获取自带字节输入流
    InputStream is=s.getInputStream();
    //自建缓冲区--自建数组
    byte[] bs=new byte[1024];
    int len=-1;
    while ((len=is.read(bs))!=-1){
        //展示读取到数据
        System.out.println(new String(bs,0,len));
    }
    //通知服务器端数据已经读取完毕
    s.shutdownInput();
    //关流
    s.close();
}

2.2 服务器端:

1.创建TCP服务器端对象,监听端口号
2.接收连接
3.获取自带字节输入流从客户端来读取数据
4.读取数据
5.通知客户端数据已经读取完毕
6.关流

public static void main(String[] args) throws IOException {
    //创建TCP服务器端对象---监听端口号
    ServerSocket ss=new ServerSocket(9092);
    //接收连接
    Socket s=ss.accept();//让线程对象进行阻塞
    //获取自带的字节输入流(默认读取客户端发送数据)
    InputStream is=s.getInputStream();
    //自带缓冲区--自建数据
    byte[] bs=new byte[1024];
    int len=-1;
    //让线程对象阻塞
    while ((len=is.read(bs))!=-1){
        //把数据读取到服务器
        System.out.println(new String(bs,0,len));
    }
    //通知客户端数据读取完毕
    s.shutdownInput();
    //把服务器端的数据发送到客户端
    //获取自带字节输出流---往客户端发送数据
    OutputStream os=s.getOutputStream();
    //发送数据
    os.write("你也好".getBytes());
    //通知客户端数据已经发送完毕
    s.shutdownOutput();
    //关流
    s.close();
    ss.close();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值