Java基础-网络编程

文章目录

1.网络相关概念

1.网络通信
  1. **概念:**两台设备之间通过网络实现数据传输
  2. **网络通信:**将数据通过网络从一台设备传输到另一台设备
  3. java.net包下面提供了一系列的接口
2.网络
  1. 概念:两台或多台设备通过一定物理设备连接起来构成了网络
  2. 根据网络的覆盖范围可以分为
    1. 局域网
    2. 城域网
    3. 广域网
3.IP地址
  1. 概念 :用于唯一标识网络中的每台计算机/主机
  2. **查看ip地址:**ipconfig
  3. **ip地址的表示形式:**点分十进制 xx.xx.xx.xx
  4. **每一个十进制数的范围:**0到255
  5. **ip地址的组成:**网络地址+主机地址
  6. 一个字节Byte等于8个bit
  7. ipv6是16个字节
  8. ip地址分类
4.域名和端口
域名
  1. www.baidu.com
  2. 好处:方便记忆
  3. 概念:将ip地址映射为域名,使用http协议
端口号
  1. 概念:用于标识计算机上某个特定的网络程序
  2. 表示形式:以整数形式0到65535
  3. 0到1024已经被占用,比如ssh 22, ftp 21, smtp 25, http 80
  4. 常见的网络程序端口号
    1. tomcat:8080
    2. mysql:3306
    3. oracle:1521
    4. sqlsever:1433
  5. 如果一个ip地址有多个应用,可以将其部署在不同的端口上,以ip+端口号的形式访问
5.网络协议
  1. 概念 :在网络编程中,数据的组织形式就是协议
  2. 网络通信协议模型
6.TCP和UDP
TCP协议
UDP协议
TCP VS UDP

2.网络编程

1.InetAddress
1.基本介绍

InetAddress对象实际上就是主机名/域名 + ip地址

2.代码实例
java 复制代码
package Internet_;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class InetAddress_ {
    public static void main(String[] args) throws UnknownHostException {

        //获取InetAddress对象的三种方式
        //1.获取主机的
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);
        //2.根据主机名获取
        InetAddress byName = InetAddress.getByName("LAPTOP-JA1NFVEM");
        System.out.println(byName);
        //3.根据域名获取
        InetAddress byName1 = InetAddress.getByName("www.sunxiansheng.cn");
        System.out.println(byName1);

        //根据InetAddress对象获取主机名/域名 + ip
        System.out.println(byName1.getHostName() + byName1.getHostAddress());
    }
}
2.Socket
1.基本介绍
  1. 基于客户端--服务器端的网络通信
  2. 底层使用的是Tcp/Ip协议
  3. 应用场景举例:客户端发送数据,服务端接受并显示控制台
  4. 基于socket的Tcp编程:
3.Tcp字节流编程
1.客户端与服务器端的信息传输
案例一
代码实例
  1. 客户端

    java 复制代码
    package Internet_;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_1_cilent {
        public static void main(String[] args) throws IOException {
            //链接本机的9999端口,并获取socket
            Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
            //使用IO字节流来传入数据
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("你好世界".getBytes());
    
            //关闭IO流和socket
            outputStream.close();
            socket.close();
        }
    }
  2. 服务器端

    java 复制代码
    package Internet_;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_1_server {
        public static void main(String[] args) throws IOException {
            //创建一个本机端口9999监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果客户端链接成功,则返回服务器端的socket
            Socket socket = serverSocket.accept();
            //使用IO流来获取数据
            InputStream inputStream = socket.getInputStream();
            //设置缓冲区
            byte[] bytes = new byte[100];
            //设置读取的长度
            int len = 0;
            //开始读取
            while ((len = inputStream.read(bytes)) != -1) {
                System.out.println(new String(bytes, 0, len)); //输出数据
            }
            
            //关闭
            inputStream.close();
            socket.close();
            serverSocket.close();
    
        }
    }
案例二
代码实例
  1. 客户端

    java 复制代码
    package Internet_;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_2_cilent {
        public static void main(String[] args) throws IOException {
            //链接本机9999端口
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            //使用IO流发送数据
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("hello,server".getBytes());
            //结束标记
            socket.shutdownOutput();
    
            //读取服务器端发送的信息
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[100];
            int len = 0;
            while ((len = inputStream.read(bytes)) != -1) {
                System.out.println(new String(bytes, 0, len));
            }
    
            //关闭
            inputStream.close();
            outputStream.close();
            socket.close();
        }
    }
  2. 服务器端

    java 复制代码
    package Internet_;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_2_server {
        public static void main(String[] args) throws IOException {
            //创建端口监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果链接成功,返回socket
            Socket socket = serverSocket.accept();
            //接受信息并输出,然后回发信息
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[100];
            int len = 0;
            int flag = 0; //记录是否读取到
            while ((len = inputStream.read(bytes)) != -1) {
                if (len > 0) {
                    flag ++;
                }
                System.out.println(new String(bytes, 0, len));
            }
            //结束标记
            socket.shutdownInput();
    
            OutputStream outputStream = null;
            if (flag > 0) { //读取到了
                //向客户端发送信息
                outputStream = socket.getOutputStream();
                outputStream.write("hello,cilent".getBytes());
            }
    
            //关闭
            inputStream.close();
            outputStream.close();
            socket.close();
            serverSocket.close();
        }
    }
  3. 注意:结束标记在Tcp字节流编程中并不是必须的!!!

案例三
代码实例
  1. 客户端

    java 复制代码
    package Internet_;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_3_cilent {
        public static void main(String[] args) throws IOException {
            //链接本机9999端口
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            //使用IO流发送数据
            OutputStream outputStream = socket.getOutputStream();
            //使用转换流转成Writer
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write("你好,服务器端");
            //1.字符流需要使用这个作为结束标志
            bufferedWriter.newLine();
            //2.使用字符流需要刷新
            bufferedWriter.flush();
    
            //接受服务器端信息
            InputStream inputStream = socket.getInputStream();
            //转换为字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //读取信息
            System.out.println(bufferedReader.readLine());
    
            //关闭
            bufferedReader.close();
            bufferedWriter.close();
            socket.close();
        }
    }
  2. 服务器端

    java 复制代码
    package Internet_;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_3_server {
        public static void main(String[] args) throws IOException {
            //创建端口监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果链接成功返回socket
            Socket socket = serverSocket.accept();
            //接受消息
            InputStream inputStream = socket.getInputStream();
            //转换为字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //读取信息
            System.out.println(bufferedReader.readLine());
    
            BufferedWriter bufferedWriter = null;
    
            OutputStream outputStream = socket.getOutputStream();
            //转换为字符流
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write("你好,客户端");
            //1.字符流使用这个作为结束标志
            bufferedWriter.newLine();
            //2.字符流需要刷新数据
            bufferedWriter.flush();
    
            //关闭
            bufferedWriter.close();
            bufferedReader.close();
            socket.close();
            serverSocket.close();
        }
    }
2.网络上传文件
案例
代码实例
  1. 客户端

    java 复制代码
    package Internet_;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_4_cilent {
        public static void main(String[] args) throws IOException {
            //链接本机8888端口
            Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
    
            //字节流发送图片到服务器端
            OutputStream outputStream = socket.getOutputStream();
            //读取本地图片
            BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("e:\\1.png"));
            //设置缓冲
            byte[] bytes = new byte[1024];
            //设置读取长度
            int len = 0;
            while ((len = bufferedInputStream.read(bytes)) != -1) {
                //发送到服务器
                outputStream.write(bytes, 0, len);
            }
            //设置结束标志
            socket.shutdownOutput();
    
            //接收到服务器端发送的收到图片再退出
            InputStream inputStream = socket.getInputStream();
            //设置缓冲
            byte[] bytes1 = new byte[100];
            //记录长度
            int len1 = 0;
            while ((len1 = inputStream.read(bytes1)) != -1) {
                System.out.println(new String(bytes1, 0, len1));
            }
    
    
            //关闭
            bufferedInputStream.close();
            outputStream.close();
            socket.close();
        }
    }
  2. 服务器端

    java 复制代码
    package Internet_;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_4_server {
        public static void main(String[] args) throws IOException {
            //监听8888端口
            ServerSocket serverSocket = new ServerSocket(8888);
            //如果链接成功则返回socket
            Socket socket = serverSocket.accept();
    
            //接收客户端字节流数据
            InputStream inputStream = socket.getInputStream();
            //设置缓冲区
            byte[] bytes = new byte[1024];
            //设置长度
            int len = 0;
            //创建字节流
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("src\\image\\1.png"));
            while ((len = inputStream.read(bytes)) != -1) {
                //存储在本地的src/1.png下
                //写入内容
                bufferedOutputStream.write(bytes, 0, len);
            }
    
            //向客户端发送,收到图片
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("收到图片".getBytes());
            //结束标志
            socket.shutdownOutput();
    
            //关闭
            outputStream.close();
            bufferedOutputStream.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
    
        }
    }
3.netstat指令
  1. netstat -an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况
  2. netstat -an | more可以分页显示,按空格是下一页
  3. netstat -anb可以查看哪个应用在监听
  4. listening表示某个端口在监听
  5. 本机地址是本机的ip地址+端口号
  6. 外部地址是连接到本机的ip地址+端口号
  7. 可以输出ctrl + c退出指令
4.Tcp网络通讯的秘密
  1. 当客户端连接到服务器的时候,实际上客户端也是通过一个端口和服务器进行通讯的,这个端口的Tcp/Ip来分配的,是随机的
  2. 示意图
4.UDP网络通讯编程(了解)
1.基本流程
  1. 核心的两个类,DatagramSocket与DatagramPacket
  2. 建立发送端,接收端(没有服务端和客户端的概念)
  3. 发送数据前,建立数据包 DatagramPacket对象
  4. 调用DatagramSocket的发送,接受方法
  5. 关闭DatagramSocket
2.原理示意图
案例
代码实例
  1. 发送方

    java 复制代码
    package Internet_;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Udp_1_send {
        public static void main(String[] args) throws IOException {
            //获取一个socket并指定接受信息的端口
            DatagramSocket datagramSocket = new DatagramSocket(9998);
    
            //装包,并指定发送的主机号和端口号
            byte[] bytes = "明天吃火锅吗".getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 9999);
    
            //发送包
            datagramSocket.send(datagramPacket);
    
            //接受信息
            //创建一个包
            byte[] bytes1 = new byte[1024]; //创建字节数组接收
            DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length);
    
            //接受包
            datagramSocket.receive(datagramPacket1);
            //输出包的内容
            System.out.println(new String(bytes1, 0, datagramPacket1.getLength()));
    
            //关闭
            datagramSocket.close();
        }
    }
  2. 接收方

    java 复制代码
    package Internet_;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Udp_1_receive {
        public static void main(String[] args) throws IOException {
            //创建一个DatagramSocket
            DatagramSocket datagramSocket = new DatagramSocket(9999); //指定接受消息的端口号
            //创建一个DatagramPacket,用来存储信息
            byte[] bytes = new byte[1024]; //用来接受信息
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
    
            //调用receive方法接受
            datagramSocket.receive(datagramPacket);
            //输出信息
            System.out.println(new String(bytes, 0, datagramPacket.getLength()));
    
            //发送信息给另一方
            //装包
            byte[] bytes1 = "明天吃火锅!!".getBytes();
            DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, 0, bytes1.length, InetAddress.getLocalHost(), 9998);
    
            //发送
            datagramSocket.send(datagramPacket1);
    
            //关闭
            datagramSocket.close();
    
        }
    }
5.网络编程作业
作业一
题目
代码实例
  1. 客户端

    java 复制代码
    package Internet_;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_1_cilent {
        public static void main(String[] args) throws IOException {
            //创建一个socket,指定要连接的ip加端口
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            //获取输出流,发送信息
            OutputStream outputStream = socket.getOutputStream();
            //转换成字符流
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            //发送信息
    //        bufferedWriter.write("name");
    //        bufferedWriter.newLine();
    //        bufferedWriter.flush();
            bufferedWriter.write("hobby");
            bufferedWriter.newLine();
            bufferedWriter.flush();
    //        bufferedWriter.write("dsfsdfsf");
    //        bufferedWriter.newLine();
    //        bufferedWriter.flush();
    
            //获取输入流,读取信息
            InputStream inputStream = socket.getInputStream();
            //转化为字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //读取信息
            String s = bufferedReader.readLine();
            //输出信息
            System.out.println(s);
    
            //关闭
            bufferedWriter.close();
            socket.close();
    
    
        }
    }
  2. 服务器端

    java 复制代码
    package Internet_;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_1_server {
        public static void main(String[] args) throws IOException {
            //开端口监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果链接成功则返回socket
            Socket socket = serverSocket.accept();
    
            //获取输入流接受信息
            InputStream inputStream = socket.getInputStream();
            //转换成字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //读取
            String s = bufferedReader.readLine();
            String res = "";
            //根据读取的信息写返回值
            switch (s) {
                case "name":
                    res = "我是孙显圣";
                    break;
                case "hobby":
                    res = "编写java程序";
                    break;
                default:
                    res = "你说啥呢";
            }
            //获取输出流
            OutputStream outputStream = socket.getOutputStream();
            //转换为字符流
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            //返回
            bufferedWriter.write(res);
            bufferedWriter.newLine();
            bufferedWriter.flush();
    
            //关闭
            bufferedWriter.close();
            bufferedReader.close();
            socket.close();
            serverSocket.close();
    
        }
    }
作业二
题目
代码实例
  1. 发送端

    java 复制代码
    package Internet_;
    
    import java.io.IOException;
    import java.net.*;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_2_sender {
        public static void main(String[] args) throws IOException {
            //创建一个datagramsocket
            DatagramSocket datagramSocket = new DatagramSocket(8889);
            //创建一个数据包,并且进行装包
            byte[] bytes = "四大名著是哪些?".getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(
                    bytes, 0, bytes.length, InetAddress.getLocalHost(), 8888);
            //发送数据
            datagramSocket.send(datagramPacket);
            //创建一个空包,接受数据包
            byte[] bytes1 = new byte[1024];
            DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length);
            datagramSocket.receive(datagramPacket1);
            //读取数据
            System.out.println(new String(bytes1, 0, datagramPacket1.getLength()));
            //关闭
            datagramSocket.close();
        }
    }
  2. 接收端

    java 复制代码
    package Internet_;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_2_receive {
        public static void main(String[] args) throws IOException {
            //创建socket
            DatagramSocket datagramSocket = new DatagramSocket(8888);
            //创建一个空包
            byte[] bytes = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
            //接受数据
            datagramSocket.receive(datagramPacket);
            //读取数据
            String s = new String(bytes, 0, datagramPacket.getLength());
            String res = new String();
            if ("四大名著是哪些?".equals(s)) {
                res = "四大名著是<红楼梦>。。。";
            }
            else {
                res = "what?";
            }
            //返回信息
            //创建一个数据包
            byte[] bytes1 = res.getBytes();
            DatagramPacket datagramPacket1 = new DatagramPacket(
                    bytes1, 0, bytes1.length, InetAddress.getLocalHost(), 8889);
            //发送
            datagramSocket.send(datagramPacket1);
    
        }
    }
作业三
题目
代码实例
  1. 客户端

    java 复制代码
    package Internet_;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.Scanner;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_3_client {
        public static void main(String[] args) throws IOException {
            System.out.println("请输入一个音乐文件名");
            Scanner scanner = new Scanner(System.in);
            String next = scanner.next();
            //获取一个socket,连接服务器
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            //将文件名传入服务器
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(next.getBytes());
            //结束信息
            socket.shutdownOutput();
    
            //读取服务器端的信息
            InputStream inputStream = socket.getInputStream();
            //缓冲区
            byte[] bytes = new byte[1024];
            //长度
            int len = 0;
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("src\\image\\gsls.mp3"));
    
            while ((len = inputStream.read(bytes)) != -1) {
                //将其保存到本地
                bufferedOutputStream.write(bytes, 0, len);
            }
            //关闭
            bufferedOutputStream.close();
            inputStream.close();
            outputStream.close();
            socket.close();
        }
    }
  2. 服务器端

    java 复制代码
    package Internet_;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_3_server {
        public static void main(String[] args) throws IOException {
            //开启服务器端口监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果链接成功则返回一个socket对象
            Socket socket = serverSocket.accept();
            //接受信息
            InputStream inputStream = socket.getInputStream();
            //设置缓冲
            byte[] bytes = new byte[1024];
            //读取信息
            int len = inputStream.read(bytes);
            BufferedInputStream bufferedInputStream = null;
            OutputStream outputStream = null;
            //判断
            if (new String(bytes, 0, len).equals("高山流水")) {
                //判断文件是否存在,如果存在则发送到客户端
                File file = new File("e:\\高山流水.mp3");
                if (file.exists()) {
                    //读取文件内容
                    bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
                    //缓冲区
                    byte[] bytes1 = new byte[1024];
                    //读取长度
                    int lens = 0;
                    while ((lens = bufferedInputStream.read(bytes1)) != -1) { //只要没有到文件末尾就继续读
                        //将读取到的数组发送给客户端
                        //获取输出流
                        outputStream = socket.getOutputStream();
                        outputStream.write(bytes1, 0, lens);
                    }
                    //结束语句
                    socket.shutdownOutput();
                }
            }
    
            //关闭
            bufferedInputStream.close();
            outputStream.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
    
    
        }
    }
相关推荐
_.Switch25 分钟前
Python 自动化运维持续优化与性能调优
运维·开发语言·python·缓存·自动化·运维开发
徐*红25 分钟前
java 线程池
java·开发语言
尚学教辅学习资料25 分钟前
基于SSM的养老院管理系统+LW示例参考
java·开发语言·java毕设·养老院
2401_8576363925 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
1 9 J27 分钟前
Java 上机实践4(类与对象)
java·开发语言·算法
Code apprenticeship28 分钟前
Java面试题(2)
java·开发语言
J不A秃V头A31 分钟前
Python爬虫:获取国家货币编码、货币名称
开发语言·爬虫·python
涔溪1 小时前
HTTP TCP三次握手深入解析
网络·tcp/ip·http
憨子周1 小时前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
三菱-Liu2 小时前
三菱MR-J4-B伺服连接器和信号排列
网络·驱动开发·硬件工程·制造·mr