Java基础复习——DAY14(网络编程;UDP ; TCP )

本文介绍了网络编程的基本要素,包括IP地址、端口和协议,重点讲解了UDP和TCP的区别,以及如何通过Java实现UDP和TCP通信的示例。从UDP数据包发送与接收,到TCP的三次握手和Socket操作,为初学者提供了一个实用教程。
摘要由CSDN通过智能技术生成

网络编程

一、网络编程入门

1. 网络编程三要素

在这里插入图片描述

网络编程实现,不同计算机之间的数据交换

网络编程三要素:

  • IP地址
    计算机的标识符
  • 端口
    网络通信本质上是两个应用程序之间的通信。端口是应用程序的标识
  • 协议
    遵守的规则(UDP协议和TCP协议)

IP
常用命令:

  • ipconfig:查看本机ip地址
  • ping IP地址:检查网络是否连通
  • 特殊ip地址:127.0.0.1
    回送地址,可以代表本机,一般用来测试

端口

  • 应用程序的唯一标识
  • 0- 65535,0~1023知名网络服务,不要用

协议

  • 连接和通讯的规则叫做协议

  • UDP:
    UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

    由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输

    例如视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议

  • TCP
    传输控制协议(Transmission Control Protocol)

    TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”

    三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠

在这里插入图片描述

2. UDP通信程序

不可靠网络协议,两端建立Socket对象

发数据:

package arrays;

import java.io.IOException;
import java.net.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        //创建发送对象
        DatagramSocket datagramSocket = new DatagramSocket();

        byte[] bys = "hello,udp,我来了!".getBytes();
        DatagramPacket datagramPacket  = new DatagramPacket(bys,bys.length, InetAddress.getByName("192.168.1.66"),10086);

        datagramSocket.send(datagramPacket);

        datagramSocket.close();
        
    }
}

接数据:

package arrays;

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

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //创建数据接收对象
        DatagramSocket ds = new DatagramSocket(10086);

        byte[] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys, bys.length);

        //接收数据
        ds.receive(dp);

        //解析数据并显示
        System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));

        ds.close();
    }
}

案例:UDP发送接受数据练习
package arrays;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class SendDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();

        Scanner sc = new Scanner(System.in);
        String line1 = sc.nextLine();

        while (!line1.equals("886")) {//不是886,打包数据并发送
            DatagramPacket dp = new DatagramPacket(line1.getBytes(), line1.getBytes().length, InetAddress.getByName("127.0.0.1"), 12345);
            ds.send(dp);
            line1 = sc.nextLine();
        }

        ds.close();
    }
}
package arrays;

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

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(12345);

        while (true) {//接受 ,解析
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys, bys.length);

            ds.receive(dp);

            System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));

        }
    }
}

老师写的关于发送的简单,里面特殊流不熟练,理解不透彻

package arrays;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class SendDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();

        //键盘录入封装(不熟练)
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = br.readLine()) != null) {
            //886结束
            if (line.equals("886")) {
                break;
            }
            DatagramPacket dp = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 12345);
            ds.send(dp);
        }

        ds.close();
       /* DatagramSocket ds = new DatagramSocket();

        Scanner sc = new Scanner(System.in);
        String line1 = sc.nextLine();

        while (!line1.equals("886")) {//不是886,打包数据并发送
            DatagramPacket dp = new DatagramPacket(line1.getBytes(), line1.getBytes().length, InetAddress.getByName("127.0.0.1"), 12345);
            ds.send(dp);
            line1 = sc.nextLine();
        }

        ds.close();*/
    }
}

3. TCP通信程序

原理:
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信

Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信

Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

发送数据:
三个步骤:

package arrays;

import java.io.*;
import java.net.*;

public class SendDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端Socket对象
        Socket s = new Socket("127.0.0.1", 10000);

        //获取输出流,写数据
        OutputStream os = s.getOutputStream();
        os.write("hello,TCP,我来了".getBytes());

        //释放资源
        s.close();
    }
}

接收数据

package arrays;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //创建服务器对象
        ServerSocket ss = new ServerSocket(10000);

        //Socket accept()侦听要连接到此套接字并接受它【监听客户端连接并返回Socket对象】
        Socket s = ss.accept();

        //获取输入流,读取数据,并显示
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        System.out.println("数据是:" + new String(bys, 0, len));

        ss.close();
        s.close();
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值