Java学习-21 网络编程

news2024/11/15 20:37:01

什么是网络编程?

可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)

基本的通信架构

基本的通信架构有2种形式:

CS架构(Client客户端/Server服务端)   

BS架构(Browser浏览器/Server服务端)。

网络通信三要素

IP

01

端口

02

协议

03

设备在网路中的地址,是唯一的标识应用程序在设备中唯一的标识链接和数据在网络中传输的规则

InetAddress

代表IP地址

名称说明
getLocalHost()获取本机IP,会以一个inetAddress的对象返回
getByName(String host)根据ip地址或者域名,返回一个inetAdress对象
getHostName()获取该ip地址对象对应的主机名。
getHostAddress()获取该ip地址对象中的ip地址信息。
isReachable(int timeout)在指定素秒内,判断主机与该ip对应的主机是否能连通

端口

标记正在计算机设备上运行的应用程序的,被规定为一个16位的二进制,范围是0~65535.

分类

周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用80,FTP占用21)

注册端口:1024~49151,分配给用户进程或某些应用程序

动态端口:49152到65535,之所以称为动态端口,是因为它一般不固定分配某种进程,而是动态分配

注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

开放式网络互联标准:OSI网络参考模型

OSI网络参考模型:全球网络互联标准

TCP/IP网络模型:事实上的国际标准

OSI网络参考模型TCP/IP网络模型各层对应面向操作

应用层

应用层HTTP、FTP、SMTP应用程序需要关注的:浏览器、邮箱、程序员一般在这一层开发
表示层
会话层
传输层传输层UDP、TCP...选择使用的TCP,UDP协议
网络层网络层IP...封装源和目标IP
数据链路层数据链路层+物理层比特流...物理设备中传输
物理层

传输层的2个通信协议
UDP(User Datagram Protocol):用户数据报协议;TCP(Transmission ControlProtocol):传输控制协议。

UDP协议

  • 特点:无连接、不可靠通信。   通信效率高!语音通话视频直播
  • 不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。
  • 发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的。

TCP协议

  • 特点:面向连接、可靠通信,
  • TCP的最终目的:要保证在不可靠的信道上实现可靠的传输。
  • TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接。

UDP通信

  • 特点:无连接、不可靠通信
  • 事先不建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP等信息封装成一个数据包,发出去就不管了。
  • Java提供一个java.net.DatagramSocket类来实现UDP通信。

DatagramSocket:用于创建客户端、服务端

DatagramPacket:创建数据包

客户端实现步骤

  1. 创建DatagramSocket对象(客户端对象) ——> 扔韭菜的人
  2. 创建DatagramPacket对象封装需要发送的数据(数据包对象)——> 韭菜盘子
  3. 使用DatagramSocket对象的send方法,传入DatagramPacket对象 ——> 开始抛出韭菜
  4. 释放资源

 

public class Client {
    public static void main(String[] args) throws Exception {

        // 创建客户端对象
        DatagramSocket socket = new DatagramSocket(7777);

        // 创建数据包对象
        //public DatagramPacket(byte buf[], int offset, int length,
        //                          InetAddress address, int port)
        // 参数一:封装发出去的数据
        // 参数二: 发送出去的数据大小(字节个数)
        // 参数三:服务端的IP地址
        // 参数四:服务器程序的端口
        byte[] bytes = "我是快乐的客户端,我爱你abc".getBytes();
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(),
                6666);

        // 开始正式发送这个数据报的数据出去
        socket.send(packet);
        System.out.println("客户端数据发送完成~~");
        // 释放资源
        socket.close();
    }
}

服务端实现步骤

  1. 创建DatagramSocket对象并指定端口(服务端对象) ——> 接韭菜的人
  2. 创建DatagramPacket对象接收数据(数据包对象) ——> 韭菜盘子
  3. 使用DatagramSocket对象的receive方法,传入DatagramPacket对象 ——> 开始接收韭菜
  4. 释放资源
public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动~~");
        // 创建一个服务器对象
        DatagramSocket socket = new DatagramSocket(6666);

        // 创建一个数据包对象,用于接收数据的
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        // 开始使用数据包来接收客户端发来的数据
        socket.receive(packet);

        //从字节数组中,把接收到的数据直接打印出来
        int len = packet.getLength();
        String rs = new String(buffer, 0, len);
        System.out.println(rs);

        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(packet.getPort());
        socket.close();
    }
}

TCP通信

  • 特点:面向链接、可靠通信
  • 通信双方事先采用“三次握手”方式建立可靠连接,实现端到端的通信,底层能保证数据成功传给服务器。
  • Java提供一个java.net.Socket类来实现TCP通信

TCP通信 ——客户端开发

客户端程序就是通过java.net包下的Socket类实现的

构造器说明
public Socket(String host, int port)根据指定的服务器ip、端口号请求与服务端建立连接,连接通过,就获得了客户端socket
方法说明
public outputStream getOutputStream()获取字节输出流对象
public InputStream getInputStream()获得字节输入流对象
public class Client {
    public static void main(String[] args) throws Exception {
        // 创建Socket对象,并同时请求与服务程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);

        // 从socket通信管道中得到一个字节输出流,用来发送数据给服务器
        OutputStream os = socket.getOutputStream();

        // 把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        // 开始写数据
        dos.writeUTF("约会吗?");

        dos.close();
        socket.close();
    }
}

客户端实现步骤

  1. 创建客户端的Socket对象,请求与服务端的连接
  2. 使用socket对象调用getOutputStream()方法得到字节输出流
  3. 使用字节输出流完成数据的发送
  4. 释放资源:关闭管道close  

 

TCP通信——服务端程序的开发

服务端是通过java.net包下的ServerSocket类来实现的

ServerSocket

构造器说明
public ServerSocket(int port)为服务端程序注册端口
方法说明
public Socket accept()阻塞等待客户端的连接请求,一旦与某个客户端成功连接,则返回服务端这边的Socket对象
public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("服务器启动~~");
        // 创建ServerSocket对象 接收客户端数据
        ServerSocket serverSocket = new ServerSocket(8888);

        // ServerSocket对象accept方法 等待客户端发起请求 也是socket
       Socket socket = serverSocket.accept();

       // 从Socket管道中得到一个字节流输入
        InputStream is = socket.getInputStream();
        DataInputStream dis = new DataInputStream(is);

        String str = dis.readUTF();
        System.out.println(str);

        // 获取IP地址
        System.out.println(socket.getRemoteSocketAddress());
        dis.close();
        serverSocket.close();
    }
}

服务端实现步骤

  1. 创建ServerSocket对象,注册服务端端口(与客户端一致)
  2. 调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象
  3. 通过Socket对象调用getInputStream()方法得到字节输入流,完成数据的接收
  4. 释放资源:关闭socket管道

使用TCP通信实现:多发多收消息

客户端使用死循环,让用户不断输入消息

服务端也使用死循环,控制服务端收完消息,继续等待下一个消息

public class Client {
    public static void main(String[] args) throws Exception {
        // 创建Socket对象,并同时请求与服务程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);
        // 从socket通信管道中得到一个字节输出流,用来发送数据给服务器
        OutputStream os = socket.getOutputStream();
        // 把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String str = sc.next();
            // 开始写数据
            if("exit".equals(str)){
                System.out.println("欢迎下次再来,退出成功~");
                dos.close();
                socket.close();
                break;
            }
            dos.writeUTF(str);
        }
    }
}

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("服务器启动~~");
        // 创建ServerSocket对象 接收客户端数据
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true) {
            // ServerSocket对象accept方法 等待客户端发起请求 也是socket
            Socket socket = serverSocket.accept();
            // 从Socket管道中得到一个字节流输入
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            try {
                String str = dis.readUTF();
                System.out.println(str);
            } catch (Exception e) {
                System.out.println(socket.getRemoteSocketAddress() + "离线了");
                dis.close();
                serverSocket.close();
                break;
            }
            //System.out.println(socket.getRemoteSocketAddress());
        }
    }
}

TCP服务端与多个客户端通信(启动多线程)

public class Client {
    public static void main(String[] args) throws Exception {
        // 创建Socket对象,并同时请求与服务程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);
        // 从socket通信管道中得到一个字节输出流,用来发送数据给服务器
        OutputStream os = socket.getOutputStream();
        // 把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String str = sc.next();
            // 开始写数据
            if("exit".equals(str)){
                System.out.println("欢迎下次再来,退出成功~");
                dos.close();
                socket.close();
                break;
            }
            dos.writeUTF(str);
        }
    }
}

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("服务器启动~~");
        // 创建ServerSocket对象 接收客户端数据
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true) {
            // ServerSocket对象accept方法 等待客户端发起请求 也是socket
            Socket socket = serverSocket.accept();
            // 创建多线程处理
            new ServerReaderThread(socket).start();
        }
    }
}

public class ServerReaderThread extends Thread {
    private final Socket socket;
    public ServerReaderThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            String name = Thread.currentThread().getName();
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            while (true) {
                try {
                    String str = dis.readUTF();
                    System.out.println(str);
                } catch (Exception e) {
                    System.out.println(socket.getRemoteSocketAddress() + "下线了");
                    socket.close();
                    dis.close();
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1463742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

粉色ui微信小程序源码/背景图/头像/壁纸小程序源码带流量主

云开发版粉色UI微信小程序源码,背景图、头像、壁纸小程序源码,带流量主功能。 云开发小程序源码无需服务器和域名即可搭建小程序另外还带有流量主功能噢!微信平台注册小程序就可以了。 这套粉色UI非常的好看,里面保护有背景图、…

【国际化】用JQuery-i18next的国际化demo,引入json

参考: 使用 i18next 的 jQuery 国际化 (i18n) 渐进式指南 (locize.com) i18next-http-backend/example/jquery/index.html at master i18next/i18next-http-backend (github.com) 文档 可能需要解决一下跨域问题,因为浏览器读取本…

基于Java+小程序点餐系统设计与实现(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

ABCDE联合创始人BMAN确认出席Hack .Summit() 2024香港Web3盛会

ABCDE联合创始人和普通合伙人BMAN确认出席Hack .Summit() 2024! ABCDE联合创始人和普通合伙人BMAN确认出席由 Hack VC 主办,并由 AltLayer 和 Berachain 联合主办,与 SNZ 和数码港合作,由 Techub News 承办的Hack.Summit() 2024区…

保护你的Web应用——CSRF攻击与防御

在Web应用开发过程中,保护用户的隐私和安全至关重要。而CSRF(Cross-Site Request Forgery,跨站请求伪造)攻击是一种常见的安全威胁,通过利用受信任用户的身份进行恶意操作,威胁到用户的账户和数据安全。本文…

django配置视图并与模版进行数据交互

目录 安装django 创建一个django项目 项目结构 创建视图层views.py 写入视图函数 创建对应视图的路由 创建模版层 配置项目中的模版路径 创建模版html文件 启动项目 浏览器访问结果 安装django pip install django 创建一个django项目 这里最好用命令行完成&#xf…

为什么需要MDL锁

点击上方蓝字关注我 在数据库管理中,元数据(metadata)的保护至关重要,而MySQL中的"元数据锁"(MDL锁)就是它的守护者。 1. 什么是MDL锁MDL锁,全名Metadata Lock,是MySQL中…

用windbg调试uefi在hyper-v

添加环境变量 CLANG_BINC:\Program Files\NASM\ NASM_PREFIXC:\Program Files\NASM\ 添加path C:\Program Files (x86)\Windows Kits\10\Tools\x64\ACPIVerify 修改edk2-master\Conf\target.txt TARGET_ARCH X64 编译这两个包 #ACTIVE_PLATFORM EmulatorPkg/…

去新加坡旅游,你必须要收藏了解的当地电商欺诈风险!

目录 多元化发展的新加坡电商 平台和消费者面临的欺诈风险 电商平台应如何防控? 2月9日,除夕,中国与新加坡免签正式生效。免签政策简化了持普通护照中国游客入境新加坡的程序,使通关更为便捷。根据协定,双方持普通护照…

【复现】某尔顿 安全审计系统任意文件读取漏洞_56

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 某尔顿网络安全审计产品支持1-3线路的internet接入、1-3对网桥;含强大的上网行为管理、审计、监控模块;用…

计算机网络-局域网和城域网(一)

1.什么是局域网? 单一机构所拥有的专用计算机网络,中等规模地理范围,实现多种设备互联、信息交换和资源共享。 2.逻辑链路控制LLC: 目的是屏蔽不同的介质访问控制方法,以向高层(网络层)提供统…

代理模式笔记

代理模式 代理模式代理模式的应用场景先理解什么是代理,再理解动静态举例举例所用代码 动静态的区别静态代理动态代理 动态代理的优点代理模式与装饰者模式的区别 代理模式 代理模式在设计模式中是7种结构型模式中的一种,而代理模式有分动态代理&#x…

使用单一ASM-HEMT模型实现从X波段到Ka波段精确的GaN HEMT非线性仿真

来源:Accurate Nonlinear GaN HEMT Simulations from X- to Ka-Band using a Single ASM-HEMT Model 摘要:本文首次研究了ASM-HEMT模型在宽频带范围内的大信号准确性。在10、20和30 GHz的频率下,通过测量和模拟功率扫描进行了比较。在相同的频…

【C++初阶】系统实现日期类

目录 一.运算符重载实现各个接口 1.小于 (d1)<> 2.等于 (d1d2) 3.小于等于&#xff08;d1<d2&#xff09; 4.大于&#xff08;d1>d2&#xff09; 5.大于等于&#xff08;d1>d2&#xff09; 6.不等于&#xff08;d1!d2&#xff09; 7.日期天数 (1) 算…

Nginx网络服务三-----(三方模块和内置变量)

1.验证模块 需要输入用户名和密码 我们要用htpasswd这个命令&#xff0c;先安装一下httpd 生成文件和用户 修改文件 访问页面 为什么找不到页面&#xff1f; 对应的路径下&#xff0c;没有这个文件 去创建文件 去虚拟机浏览器查看 有的页面不想被别人看到&#xff0c;可以做…

MongoDB的介绍和使用

目录 一、MongoDB介绍 二、MongoDB相关概念 三、MongoDB的下载和安装 四、SpringBoot 整合 MongoDB 一、MongoDB介绍 MongoDB是一种NoSQL数据库管理系统&#xff0c;采用面向文档的数据库模型。它以C语言编写&#xff0c;旨在满足大规模数据存储和高性能读写操作的需求。Mo…

BUGKU-WEB 文件包含

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 你说啥我就干啥&#xff1a;点击一下试试你会想到PHP伪协议这方面去嘛&#xff0c;你有这方面的知识储备吗&#xff1f; 相关工具 解题步骤 查看源码 看到了一点提示信息&#xff1a; ./index.…

【压缩感知基础】Nyquist采样定理

Nyquist定理&#xff0c;也被称作Nyquist采样定理&#xff0c;是由哈里奈奎斯特在1928年提出的&#xff0c;它是信号处理领域的一个重要基础定理。它描述了连续信号被离散化为数字信号时&#xff0c;采样的要求以避免失真。 数学表示 Nyquist定理的核心内容可以描述如下&…

06 内存管理

目录 c/c内存分布c语言中动态内存管理方式c中动态内存管理方式operator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)常见题 1. c/c内存分布 看一段代码 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticV…

sql server想要小数点后向下取整怎么搞

select FORMAT(3.169, N2) as 四舍五入1, CAST(3.169 AS decimal(9,2)) as 四舍五入2, ROUND(3.169, 2) as 四舍五入3, CAST(FLOOR(3.169 * 100) / 100 AS decimal(9,2)) as 向下取整1, FLOOR(3.169 * 100) / 100 as 向下取整2, ceiling(3.169 * 100) / 100 as 向上取整—…