当前位置: 首页 > news >正文

Java第二十一章总结

网络编程三要素

ip地址:计算机在网络中的唯一标识
端口:应用程序在计算机中唯一标识
协议:通信协议,常见有UDP和TCP协议

InetAddress类

表示Internet协议地址

        //返回InetAddress对象
        InetAddress byName = InetAddress.getByName("DESKTOP-1ET1T7L");

        //返回计算机名
        String hostName = byName.getHostName();

        //返回Ip地址
        String hostAddress = byName.getHostAddress();

端口
端口号:用两个字节表示的整数,它的取值范围是0~ 65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被占用,会导致程序启动失败

协议
计算机网络中,连接和通信的规则被称为网络通信协议

UDP协议
 用户数据报协议(User Datagram Protocol)
 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
 UDP协议消耗系统资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输

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

 TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

 在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”

三次握手:
  第一次握手,客户端向服务器端发出连接请求,等待服务器确认

  第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

  第三次握手,客户端再次向服务器端发送确认信息,确认连接

UDP发送数据
Java提供了DatagramSocket类作为基于UDP协议的Socket

构造方法

 相关方法

        //创建一个发送数据Socket对象
        DatagramSocket ds=new DatagramSocket();
        //创建一个包,用于存放要发送的数据
        byte[] bys="hello".getBytes();
        DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),8888);
        //发送数据
        ds.send(dp);
        ds.close();
      

 

UDP接受数据

构造方法

方法名说明
DatagramPacket(byte[] buf, int len)创建一个DatagramPacket用于接收长度为len的数据包

相关方法

        //创建一个接收端的Socket对象
        DatagramSocket ds=new DatagramSocket(8888);
        
        //创建一个接受数据的包
        byte[] bys=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bys,bys.length);
        
        //接收数据
        ds.receive(dp);
        //获取数据
        byte[] data = dp.getData();
        //dp.getLength是接受到的数据长度
        System.out.println(new String(data,0,dp.getLength()));
        ds.close();
 

UDP三种通讯方式

单播:两个主机之间的端对通信

组播:对一组特定的主机进行通信

广播:一个主机对整个局域网所有主机通信

组播代码实现:

//发送端
        //创建发送端的Socket对象
        DatagramSocket ds=new DatagramSocket();
        //创建数据包,
        byte[] bys="hello".getBytes();
        DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("224.0.1.1"),8888);
        //发送
        ds.send(dp);
        //释放资源
        ds.close();
        
//========================================================
//接收端

        //创建一个接收端的Socket对象
        MulticastSocket ms=new MulticastSocket(8888);
        //创建一个接受数据的包
        byte[] bys=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bys,bys.length);

        //把当前电脑绑定一个组播地址
        ms.joinGroup(InetAddress.getByName("224.0.1.1"));

        //接收数据
        ms.receive(dp);
        //获取数据
        byte[] data = dp.getData();
        //dp.getLength是接受到的数据长度
        System.out.println(new String(data,0,dp.getLength()));
        ms.close();

TCP发送数据
客户端用用Socket类,
服务器端用ServerSocket类

Socket构造方法


相关方法方

        //创建一个客户端Socket对象
        Socket s=new Socket("127.0.0.1",8888);
        //获取输出流,输出数据
        OutputStream outputStream = s.getOutputStream();
        outputStream.write("hello".getBytes());
        //释放资源
        s.close();
 

TCP接收数据

构造方法

方法名说明
ServletSocket(int port)创建绑定到指定端口的服务器套接字

相关方法

方法名说明
Socket accept()监听要连接到此的套接字并接受它

        //创建服务器端ServerSocket对象
        ServerSocket ss=new ServerSocket(8888);
        //监听
        Socket accept = ss.accept();
        //创建一个输入流对象接收数据
        InputStream inputStream = accept.getInputStream();
        byte[] bytes=new byte[1024];
        int len=inputStream.read(bytes);
        String data =new String(bytes,0,len);
        System.out.println(data);
        accept.close();
        ss.close();
 

文件上传

从本地读取文件数据,发送给服务器端
服务器端接受数据后,保存到服务器本地

 

//客户端

   //获取客户端Socket对象
        Socket s = new Socket("127.0.0.1", 8888);
        //从本地读取要上次的文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("JavaSE\\aa.jpg"));
        OutputStream os = s.getOutputStream();
        byte[] bys = new byte[1024];
        int i;
        while ((i = bis.read(bys)) != -1) {
            // os.write(i);
            os.write(bys, 0, i);
        }

        os.flush();

        //给服务器一个结束标记,标识已经传输完毕
        s.shutdownOutput();

        //获取服务器给回的信息
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

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

//======================================

//服务器端

 //创建服务器ServerScoket对象
        ServerSocket ss = new ServerSocket(8888);
        //开始监听
        Socket s = ss.accept();
        //接受客户端数据
        InputStream is = s.getInputStream();
        //创建一个字符缓冲流保存接受的数据
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("JavaSE\\bb.jpg"));
        int len;
        byte[] bys = new byte[1024];
        while ((len = is.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        //告诉客户端已经接受完毕
        s.shutdownInput();

        //给客户端返回“上传成功信息”
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write("上传成功");
        bw.newLine();
        bw.flush();

        //释放资源
        bos.close();
        s.close();
        ss.close();


 

http://www.lryc.cn/news/255163.html

相关文章:

  • 【keil备忘录】2. stm32 keil仿真时的时间测量功能
  • 图的存储(邻接矩阵,边集数组,邻接表,链式前向星)
  • Linux 基础知识整理(二)
  • 2024年值得关注的8个未来数据库
  • C++新经典模板与泛型编程:将trait类模板用作模板参数
  • BUUCTF-[GYCTF2020]FlaskApp flask爆破pin
  • web前端实现LED功能、液晶显示时间、数字
  • YOLOv8改进 | 2023 | DiverseBranchBlock多元分支模块(有效涨点)
  • Spring Boot 3 整合 Spring Cache 与 Redis 缓存实战
  • kubeadm 安装k8s1.28.x 底层走containerd 容器
  • “分割“安卓用户,对标iOS,鸿蒙崛起~
  • 【Vulnhub 靶场】【hacksudo: ProximaCentauri】【简单 - 中等】【20210608】
  • share pool的组成
  • 应用案例 | 基于三维视觉的汽车零件自动化拧紧解决方案
  • Redis server启动源码
  • C++基础 强制转换
  • 【python、opencv】opencv仿射变换原理及代码实现
  • mac本地部署stable-diffusion
  • dockers安装rabbitmq
  • 07、pytest指定要运行哪些用例
  • springboot集成cxf
  • 快速认识什么是:Kubernetes
  • YOLOv6 学习笔记
  • paypal贝宝怎么绑卡支付
  • 活动回顾|德州仪器嵌入式技术创新发展研讨会(上海站)成功举办,信驰达科技携手TI推动技术创新
  • Vue 循环走马灯
  • <Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(3)》(27)
  • 【华为数据之道学习笔记】3-2 基础数据治理
  • GO设计模式——7、适配器模式(结构型)
  • Java实现TCP一对一通信,实现UDP群聊通信