Java 网络编程

2023-05-16

文章目录

  • 前言
  • 一、什么是计算机网络?
  • 二、网络通信的两个重要因素
    • 1.通讯双方的地址
      • 1)ip
      • 2)端口号
    • 2.规则:网络协议
  • 三、Ip地址
    • 1.InetAddress
    • 2.Ip的分类
      • 1)ipv4/ipv6
      • 2)公网(互联网)和私网(局域网)
    • 3.域名
  • 四、端口
    • 1.什么是端口
    • 2.端口的分类
      • 1)公有端口
      • 2)程序注册端口
      • 3)动态、私有端口
      • 4)cmd查看端口指令
      • 5)InetSocketAddress类
  • 五、通信协议
    • 1.TCP
      • 1)三次握手
      • 2)四次挥手
    • 2.UDP
  • 六、TCP实现聊天
    • 1.客户端
    • 2.服务器端
  • 七、TCP实现上传
    • 1.客户端
    • 2.服务器端
  • 八、UDP实现聊天
    • 1.接收端/传输端1
    • 2.接收端/传输端2
  • 总结


前言

在进行网页编程和多线程的学习之前需要对网络编程有足够的了解以及学会如何去运用进程序当中


一、什么是计算机网络?

在没有互联网之前,我们都是通过写书信然后由邮递员送到我们指定人的手上。随着科技的发展,现在已经是通过网络把整个地球连接起来了,正如人们说描述的那样形成了一个地球村。而计算机网络就是这个的代表物,两台电脑之间想要传输照片或者视频,就需要计算机网络来辅助。总而言之,计算机网络就是连接分散计算机设备以实现信息传递的系统。

二、网络通信的两个重要因素

1.通讯双方的地址

1)ip

例如:192.0.0.1

2)端口号

例如:8080、3306等

2.规则:网络协议

例如:TCP/IP HTTP,HTTPS,FTP....

三、Ip地址

1.InetAddress

因为没有构造方法所以不能通过new的方式创建一个InetAddress对象。

通过静态调用我们可以使用以下的方法来获取一台网络计算机的ip地址

1、getByName()

2、getLocalHost()

3、getAllByName()

4、getLoopbackAddress()

5、getByAddress()

2.Ip的分类

1)ipv4/ipv6

ipv4:32位,由四个字节组成,从0-255. 例如:127.0.0.1

ipv6:128位,8个无符号整数构成 例如:2022:1aaa:2bbb:3ccc:4ddd:0000:0000:12ab

2)公网(互联网)和私网(局域网)

通过a,b,c,d,e来划分

a类:1.0.0.0~126.0.0.0 子网:255.0.0.0

b类:128.0.0.0~191.255.0.0子网:255.255.0.0

c类:192.0.0.0~223.255.255.0子网:255.255.255.0

d类:多播地址

e类:保留地址

私有地址a,b,c

A类:10.0.0.0~10.255.255.255

B类:172.16.0.0~172.31.255.255

C类:192.168.0.0~192.168.255.255

3.域名

通常ip不是很好记忆所以通过域名来记忆ip


四、端口

1.什么是端口

可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。

2.端口的分类

端口是从0~65535,TCP和UDP是独立分开计算的所以总共会有65535*2的端口号

1)公有端口

从0~1023,比如HTTP:80,HTTPS:443,FTP:21,Telent:23

2)程序注册端口

1024~49151,分配给用户或者程序,如Mysql:3306,Tomcat:8080

3)动态、私有端口

从49152~65535

4)cmd查看端口指令

1、netstat -ano -------查看所有端口

2、netstat -ano|findstr ----------查看指定端口

3、tasklist|findstr --------------查看指定端口的进程

5)InetSocketAddress类

1、getAddress()

2、getHostString()

3、getHostString()

4、getPort()

5、getHostName()

五、通信协议

1.TCP

连接,稳定

有客户端和服务器端

传输完成,释放连接,效率低

1)三次握手

1、第一次握手

客户端发送请求给服务器端,希望与服务器端建立连接,并进入等待状态,等待服务器端确认

2、第二次握手

服务器端检测到客户端想要建立连接,经设置后表示收到客户端的信息并也想与客户端建立连接的信息

3、第三次握手

客户端接受服务器传来的信息后发送数据包给服务器端,服务器端检查如果正确,则客户端与服务器端建立连接,并可以进行数据的传输

2)四次挥手

1、第一次挥手

客户端发送请求想要终止连接的信息给服务器端,停止发送信息并进入等待状态,等待服务器端确认

2、第二次挥手

服务器端接受到客户端发来的停止连接信息,并传递消息给上层,然后进入关闭等待状态,虽然此时客户端已经不会发送数据到服务器端,但是服务器端仍能发送数据到客户端

3、第三次挥手

客户端接受到服务器端的信息后,进入最终等待状态。此时服务器端再次发送断开连接的信息,并等待客户端确认

4、第四次挥手

客户端接收到信息后发出确认断开连接的信息后,服务器端立刻关闭连接,但是客户端需要等待2*MSL(最长报文段寿命)的时间后,客户端才进入CLOSED状态关闭连接

2.UDP

不连接,不稳定

有客户端和服务器端,但是无明显区别

不管是否接收,都会先传输给你

六、TCP实现聊天

1.客户端

要与服务器端连接,就必须要获取到服务器的ip和端口,然后协议是TCP协议,然后然后通过套接字传入ip和端口,创建输出流,并写入要传输的内容

示例代码
public class Client {
    public static void main(String[] args) throws IOException {
        //创建InetAddress对象用来获取ip地址
        InetAddress localhost = InetAddress.getByName("localhost");
        //创建服务器给定的端口号
        int port = 6693;
        //创建套接字对象并传入ip和端口号
        Socket socket = new Socket(localhost,port);

        //创建输出流,并写入要传输的内容
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("你好啊".getBytes());

        //关闭流
        outputStream.close();
        socket.close();
    }
}

2.服务器端

创建套接字对象,并监听指定端口,创建输入流来获取客户端传来的数据,然后创建一个管道流保证不会乱码

示例代码
public class Service {
    public static void main(String[] args) throws IOException,InterruptedException {
        //创建服务器套接字对象,并监听指定端口
        ServerSocket serverSocket = new ServerSocket(6693);
        System.out.println("服务器开启ing......");

        //模拟服务器开启过程
        Thread.sleep(1200);
        System.out.println("服务器已开启");

        //接收客户端传来的数据
        Socket accept = serverSocket.accept();

        //创建输入流
        InputStream inputStream = accept.getInputStream();
        System.out.println("服务器接收成功");
        //创建管道输出流,保证不会乱码
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        //边读边写
        while((len=inputStream.read(bytes))!=-1){
            byteArrayOutputStream.write(bytes,0,len);
        }
        //返回获取到的客户端文件
        System.out.println("client:   "+byteArrayOutputStream.toString());


        //关闭服务器和流
        Thread.sleep(5000);
        byteArrayOutputStream.close();

        inputStream.close();
        serverSocket.close();

        System.out.println("服务器关闭成功");
    }
}

七、TCP实现上传

1.客户端

客户端需要通过字节或者字符输入流来获取图片或者文件,然后再通过输出流传入到套接字中

示例代码
public class Client {
    public static void main(String[] args) throws IOException {
        //创建InetAddress对象用来获取ip地址
        InetAddress localhost = InetAddress.getByName("localhost");
        //创建服务器给定的端口号
        int port = 6693;
        //创建套接字对象并传入ip和端口号
        Socket socket = new Socket(localhost,port);
        OutputStream os = socket.getOutputStream();

        //创建输出流,并写入要传输的内容
        FileInputStream in = new FileInputStream("d:\\picture\\pixiv\\小奏.jpg");
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len=in.read(bytes))!=-1){
            os.write(bytes,0,len);
        }

        //关闭流
        in.close();
        os.close();
        socket.close();
    }
}

2.服务器端

创建套接字对象,并监听指定端口,创建输入流来获取客户端传来的数据,然后创建一个管道流保证不会乱码

示例代码
public class Service {
    public static void main(String[] args) throws IOException,InterruptedException {
        //创建服务器套接字对象,并监听指定端口
        ServerSocket serverSocket = new ServerSocket(6693);
        System.out.println("服务器开启ing......");

        //模拟服务器开启过程
        Thread.sleep(1200);
        System.out.println("服务器已开启");

        //接收客户端传来的数据
        Socket accept = serverSocket.accept();

        //创建输入流
        InputStream inputStream = accept.getInputStream();
        System.out.println("服务器接收成功");
        //创建管道输出流,保证不会乱码
        FileOutputStream fo = new FileOutputStream(new File("test"));
        int len = 0;
        byte[] bytes = new byte[1024];
        //边读边写
        while((len=inputStream.read(bytes))!=-1){
            fo.write(bytes,0,len);
        }
        //返回获取到的客户端文件
        System.out.println("client:   "+fo.toString());


        //关闭服务器和流
        Thread.sleep(5000);
        fo.close();

        inputStream.close();
        serverSocket.close();

        System.out.println("服务器关闭成功");
    }
}

八、UDP实现聊天

1.接收端/传输端1

与TCP协议不同的是,UDP只需要你知道对方的IP、端口就可以直接发送包给你但是并不需要你去确认收到,而且没有TCP的C/S或者B/S模式,接收端也可以是发送端

示例代码
public class Udp1 {
    public static void main(String[] args) throws IOException {
        //创建套接字,并监听端口
        DatagramSocket datagramSocket = new DatagramSocket(6603);

        //创建输入流,并读取控制台输入信息
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        //将传入信息放入byte数组
        String msg = reader.readLine();
        byte[] buffer = msg.getBytes();

        //创建包
        DatagramPacket packet =
                new DatagramPacket(buffer,0,buffer.length,
                        new InetSocketAddress("localhost",6604));

        //发送包
        datagramSocket.send(packet);

        
        //准备接收包
        byte[] buffer2 = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(buffer2,0,buffer2.length);


        //接收包并输出
        datagramSocket.receive(packet2);
        System.out.println(new String(buffer2, 0, buffer2.length));

        //关闭流
        reader.close();
        datagramSocket.close();
    }
}

2.接收端/传输端2

与1一样,创建接收和传输的内容即可,只不过是与1的代码相调换了顺序

示例代码
public class Udp2 {
    public static void main(String[] args) throws IOException {
        
        DatagramSocket datagramSocket = new DatagramSocket(6604);
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);


        datagramSocket.receive(packet);
        System.out.println(new String(buffer, 0, buffer.length));


        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String msg = reader.readLine();
        byte[] buffer2 = msg.getBytes();

        DatagramPacket packet2 =
                new DatagramPacket(buffer2,0,buffer2.length,
                        new InetSocketAddress("localhost",6603));

        datagramSocket.send(packet2);

        reader.close();
        datagramSocket.close();
    }
}

总结

网络变成更多的还是流的使用,而真正进行通讯的只是需要ip端口,和协议,然后通过套接字就可以实现了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 网络编程 的相关文章

  • ZYNQ中的GPIO与AXI GPIO

    GPIO GPIO 一种外设 xff0c 对器件进行观测和控制MIO 将来自PS外设和静态存储器接口的访问多路复用到PS引脚上处理器控制外设的方法 通过一组寄存器包括状态寄存器和控制寄存器 xff0c 这些寄存器都是有地址的 xff0c 通
  • FTP文件传输协议

    简介 FTP协议 xff1a 文件传输协议 xff08 File Transfer Protocol xff09 协议定义了一个在远程计算机系统和本地计算机系统之间传输文件的一个标准FTP运行在OSI模型的应用层 xff0c 并利用传输协议
  • python中如何用for循环语句1加到100?

    计算机是现代一种用于高速计算的电子计算机器 xff0c 是一种高级的计算工具 可以进行数值计算 xff0c 又可以进行逻辑计算 xff0c 还具有存储记忆功能 是能够按照程序运行 xff0c 自动 高速处理海量数据的现代化智能电子设备 计算
  • controller层配置全局配置拦截器

    大家好 xff0c 我是一名在算法之路上不断前进的小小程序猿 xff01 体会算法之美 xff0c 领悟算法的智慧 希望各位博友走过路过可以给我点个免费的赞 xff0c 你们的支持是我不断前进的动力 xff01 xff01 加油吧 xff0
  • 用python写DFS和BFS算法

    前言 xff1a 菜鸟学算法 加油 xff01 一 什么是DFS和BFS xff1f 1 BFS算法 xff1a 宽度优先搜索算法 xff08 又称广度优先搜索 xff09 是最简便的图的搜索算法之一 xff0c 这一算法也是很多重要的图的
  • 进程同步 生产者消费者问题

    题目 xff1a 某超级市场 xff0c 可容纳100人同时购物 入口处备有篮子 xff0c 每个购物者可持一只篮子入内购物 出口处结帐 xff0c 并归还篮子 xff08 出 入口仅容一人通过 xff09 请试用P xff08 S xff
  • Windows-取消锁屏密码

    开始 gt 设置 gt 账户 gt 登录选项 gt 密码 gt 输入当前密码 gt 更改密码 xff08 默认为空就行 xff09 gt 下一步 gt 完成
  • 腾讯云4核服务器和2核区别大吗?性能差异

    腾讯云服务器2核和4核性能有什么区别 xff1f 云服务器核数指的是vCPU处理器 xff0c 云服务器CPU核心数如何选择主要取决于用户实际应用情况 xff0c 如果当前应用对CPU计算能力要求不高 xff0c 2核完全可以胜任 xff0
  • 最详细的手工LAMP环境搭建

    环境 xff1a 阿里云服务器ECS xff0c Alibaba Cloud Linux 3 2104 LTS 64位 xff0c 2核 vCPU 2 GiB LAMP 是搭建Web应用时最常用的环境 xff0c LAMP 分别表示 Lin
  • python 语音播报 简单入门

    coding utf 8 import pyttsx3 import time 初始化 pt 61 pyttsx3 init 说什么 pt say 34 你好 xff0c dbirder 34 开始说吧 pt runAndWait time
  • 【optimizer详解】

    optimizer 定义 optimizer就是在深度学习反向传播过程中 xff0c 指引损失函数 xff08 目标函数 xff09 的各个参数往正确的方向更新合适的大小 xff0c 使得更新后的各个参数让损失函数 xff08 目标函数 x
  • docker网络配置

    开放容器端口 执行docker run的时候有个 p选项 xff0c 可以将容器中的应用端口映射到宿主机中 xff0c 从而实现让外部主机可以通过访问宿主机的某端口来访问容器内应用的目的 p选项能够使用多次 xff0c 其所能够暴露的端口必
  • Ubuntu使用SSH工具默认用root用户连接;解决SSH不能用root用户连接。

    ROOT是什么意思 xff1f Root xff0c 也称为根用户 xff0c 是Unix 如 Solaris AIX BSD xff09 和类UNIX系统 如 Linux QNX 等 xff0c 及Android和iOS移动设备系统中的唯
  • LeetCode55. 跳跃游戏(贪心)

    力扣 解题思路 xff1a 1 设想一下 xff0c 对于数组中的任意一个位置 y xff0c 我们如何判断它是否可以到达 xff1f 根据题目的描述 xff0c 只要存在一个位置 x xff0c 它本身 可以到达 xff0c 并且它跳跃的
  • LeetCode300. 最长递增子序列(动态规划 / 贪心)

    力扣 解题思路 xff1a 1 动态规划 状态定义 xff1a dp i 的值代表 nums 以 nums i 结尾的最长子序列长度 转移方程 xff1a 设 j 0 i j 0 i xff0c 考虑每轮计算新 dp i 时 xff0c 遍
  • LeetCode299. 猜数字游戏

    力扣 解题思路 1 使用一个vector flag 记录哪个位置的下的字符相同 xff0c 使用一个Hash map记录secret中剩余字符与次数的映射 2 遍历guess 找到guess中的字符与 secret 相同但是在不同位置的字符
  • 八大排序 - (详解)

    目录 一 直接插入排序 1 思想 2 实现 3 特性总结 二 希尔排序 1 思想 2 实现 3 特性总结 三 选择排序 1 思想 2 实现 3 特性总结 四 堆排序 1 思想 2 实现 3 特性分析 五 冒泡排序 1 思想 2 实现 3 特
  • 牛客 - 另类加法

    另类加法 解题思路 1 二进制位异或运算相当于对应位相加 xff0c 不考虑进位 比如 xff1a 1 1 61 0 gt 1 43 1 61 0 当前位值为0 xff0c 进一位 1 0 61 1 gt 1 43 0 61 1 当前位值为
  • Jmeter添加MD5方法插件

    1 xff1a 下载 https jmeter plugins org install Install 2 xff1a jmeter plugins manager 1 3 jar放到 apache jmeter 5 0 lib ext目录
  • Linux常用指令(详解)

    目录 1 ls指令 2 pwd 3 clear 4 whoami 5 cd 6 tree 7 mkdir 8 touch 9 rmdir 10 rm 11 man 12 cp 13 mv 14 cat 15 more 16 less 17

随机推荐

  • 进程间通信详解

    目录 一 进程间通信介绍 1 进程间通信的目的 2 进程间通信的本质 3 进程间通信分类 二 什么是管道 三 匿名管道 1 匿名管道只能用于具有亲缘关系的进程之间进行通信 xff0c 常用于父子 2 pipe函数 3 匿名管道的使用 4 管
  • 大厂笔试真题

    1 复数相乘 2 K个一组翻转链表 include lt iostream gt include lt vector gt include lt string gt using namespace std void Reverse vect
  • 文件系统概念

    1 文件逻辑结构 1 有结构文件和无结构文件 定长记录 可变长记录 2 顺序文件 3 索引文件 4 索引顺序文件 5 多级索引顺序文件 2 文件目录 1 文件控制块 2 目录结构 3 索引节点 3 文件的物理结构 1 文件块 xff0c 磁
  • Makefile

    1 基本规则 目标 依赖 目标 要生成的目标文件 tab 命令 依赖 目标文件由那些文件生成 命令 通过执行该命令由依赖文件生成目标 举例 add o add c gcc c add c o add c 1 其他规则 目标的时间必须晚于依赖
  • 计算机组成原理测试题

    随堂测试 1 单项选择题 第1题 主频为10MHZ xff0c 则时钟周期为 10ns 100ns xff08 答案 xff09 1000ns 第2题 冯 诺伊曼机工作方式的基本特点是 D 存储器按内容选择地址 C 堆栈操作 B 按地址访问
  • js练习题(3)

    1 序列 xff1a 1 xff0c 2 xff0c 3 xff0c 5 xff0c 8 xff0c 13 找出第20个数是多少 得出前20个数之和是多少 xff1f span class token keyword function sp
  • JAVA 两数求商

    题目描述 xff1a 给定两个整数 a 和 b xff0c 求它们的除法的商 a b xff0c 要求不得使用乘号 除号 以及求余符号 注意 xff1a 整数除法的结果应当截去 xff08 truncate xff09 其小数部分 xff0
  • 约瑟夫环总结

    约瑟夫环 N个人围成一圈 xff0c 从第一个人开始报数 xff0c 报到m的人出圈 xff0c 剩下的人继续从1开始报数 xff0c 报到m的人出圈 xff0c 如此往复 问题一 xff1a 所有人都出圈 xff0c 求出圈的人的编号顺序
  • Linux操作系统实验:生产者和消费者问题

    一 实验目的及要求 生产者消费者 问题是一个著名的同时性编程问题的集合 通过编写经典的 生产者消费者 问题的实验 xff0c 读者可以进一步熟悉 Linux 中多线程编程 xff0c 并且掌握用信号量处理线程间的同步互斥问题 二 实验仪器设
  • COCO数据集解析

    1 简介 官方网站 xff1a http cocodataset org 全称 xff1a Microsoft Common Objects in Context xff08 MS COCO xff09 支持任务 xff1a Detecti
  • U盘启动盘cmd制作

    U盘 移动硬盘启动盘cmd手工制作 插入 gt 61 8G的u盘 移动硬盘 1 win 43 r打开运行窗口 xff0c 输入cmd回车打开命令行 xff08 命令提示符不分大小写 xff09 2 在DOS命令行窗口中输入 diskpart
  • 系统调用的概念和作用

    一 什么是系统调用 xff0c 有何作用 1 概念 用户接口 命令接口 允许用户直接使用 程序接口 允许用户通过程序间接使用 xff1a 由一组系统调用组成 系统调用 系统调用 是操作系统提供给应用程序 xff08 程序员 编程人员 xff
  • linux系统下键盘按键的重新映射——xmodmap工具和xev工具

    虽然linux下小键盘还是不能用 xff0c 但是找到一篇好文章 linux系统下键盘按键的重新映射 xmodmap工具和xev工具 文章目录 1 xev工具 xff1a 2 xmodmap工具 大家会不会有时候 xff0c 感觉键盘上的某
  • Sorry, you have been blocked(Chatgpt登录被屏蔽)

    解决办法 xff1a 关闭浏览器 xff0c 重新打开 vpn换个地区 xff0c 换个美国的vpn
  • Linux查看ip地址出错,ens33不显示inet解决

    在我的私人博客中也有写 xff0c 大家去看看哦 Linux 查看 ip 地址出错 xff0c ens33 不显示 inet 解决 白都 baidu2001 top 问题 xff1a 在 CentOS7中输入 ip addr 时 xff0c
  • Java多线程(超详解)

    目录 1 线程简介 1 1 程序 1 2 进程 1 3 线程 1 4 多线程 1 5 普通方法调用和多线程 2 线程创建 2 1 继承Thread类 2 2 实现Runnable接口 2 3 实现Callable接口 xff08 了解 xf
  • 学习Java的路线

    JavaSE 18 20天 xff09 数据库 xff08 4天 xff09 前端 xff08 7天 xff09 Javaweb xff08 7天 xff09 SSM框架 xff08 9天 xff09 Linux xff08 7天 xff0
  • Java常用类的使用方法小结

    文章目录 前言一 常用类有哪些 xff1f 二 常用类使用方法1 Object类0 xff09 所用的对象1 xff09 getClass方法2 xff09 hasCode方法3 xff09 toString方法4 xff09 equals
  • Java I/O流

    文章目录 前言一 什么是流 xff1f 二 流的分类1 根据流向来分1 xff09 输入流2 xff09 输出流 2 根据单位来分1 xff09 字节流2 xff09 字符流 3 根据功能来分1 xff09 节点流2 xff09 过滤流 三
  • Java 网络编程

    文章目录 前言一 什么是计算机网络 xff1f 二 网络通信的两个重要因素1 通讯双方的地址1 xff09 ip2 xff09 端口号 2 规则 xff1a 网络协议 三 Ip地址1 InetAddress2 Ip的分类1 xff09 ip