0%

【Java基础】网络编程

关于网络编程的学习笔记
(注意:只是简单介绍网络编程,真正深入学习要去学JavaWeb)

一、网络编程概述

1.1 定义

  • 网络编程目的:
    • 直接或间接地接通网络协议与其他计算机实现数据交换,进行通讯
  • 网络编程中的两个主要问题:
    • ·如何转且定位网络上一台或多台主机:定位主机上特定的应用
    • 找到主机后如何可靠高效地进行数据传输

1.2 网络通信要素

  • (1)通信双方地址
    • ip
    • 端口号
  • (2)一定的规则(即:网络通信协议)
    • TCP/IP参考模型:国际标准
      • 应用层 — HTTP、FTP、Telnet、DNS…
      • 传输层 — TCP、UDP…
      • 网络层 — IP、ICMP、ARP…
      • 物理+数据链路层 — Link

1.3 IP地址和端口号

  • IP地址:InetAddress类

    • 定义:唯一标识Internet上的计算机
    • 分类:IPV4 、IPV6
    • 分类2:公网地址(万维网地址)、私网地址(局域网地址)
  • 域名:类似 www.baidu.com www.mi.com

    • 域名使用方法:域名 —> DNS(解析域名) —> IP地址 —> 访问
    • 本地地址:loaclhost — 127.0.0.1
  • 端口号:标识正在计算机上运行的进程

    • 分类:
      • 公认端口
      • 注册端口
      • 动态/私有端口
  • 端口号 和 IP地址 的组合得出一个网络套接字:Socket

1.4 网络通信协议

  • 分类:TCP 、 UDP

  • TCP:

    • (1)要先建立TCP传输数据通道
    • (2)采用“三次握手”方式,点对点通信,可靠的
    • (3)连接中课传输大量数据
    • (4)传输完毕需要关闭连接,效率低
    • (5)四次挥手关闭连接
  • UDP:

    • (1)将数据、目的、源封装为包
    • (2)每个数据大小限制在64k内
    • (3)发送不管对方是否准备好,接受发收到也不确认,故不可靠
    • (4)可以广播发送
    • (5)发送数据结束时无需释放资源,开销小,速度快

1.5 InetAddress类

  • InetAddress对象表示一个主机的位置,类似于IO流中的File类

  • 实例化:

    • (1)getByName(String host):设置IP地址主机
    • (2)getLocalHost():本地主机
  • 常用方法:

    • (1)getHostName():获取主机域名
    • (2)getHostAddress():获取主机IP地址

二、TCP网络编程

  • 实现TCP网络编程,需要用到Socket类、和ServerSocket类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    //客户端:放送照片
    @Test
    public void client() throws IOException {
    //1.访问服务器地址
    Socket socket = new Socket("127.0.0.1", 8899);

    //2.创建输入输出流
    OutputStream os = socket.getOutputStream();
    FileInputStream fis = new FileInputStream("佩可莉姆.png");

    //3.读取本地图片数据,并向服务器发送
    byte[] bbuf = new byte[1024];
    int len;
    while((len = fis.read(bbuf)) != -1){
    os.write(bbuf, 0, len);
    }
    socket.shutdownOutput();//关闭数据的输出
    //read方法会使线程阻塞,不知道什么时候结束,需要手动关闭

    //------------------------------------------
    //4.接受服务器端返回的数据,显示到控制台上
    InputStream is = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);

    char[] cbuf = new char[5];
    while((len = isr.read(cbuf)) != -1){
    System.out.print(new String(cbuf, 0, len));
    }

    //5.资源关闭
    isr.close();
    os.close();
    socket.close();
    fis.close();

    //6.省略了try-catch-finally处理
    }

    //服务器:接受照片并保存到本地
    @Test
    public void server() throws IOException {
    //1.创建服务器
    ServerSocket serverSocket = new ServerSocket(8899);

    //2.等待接受客户端的数据
    Socket accept = serverSocket.accept();

    //3.收到客户端的数据后,创建相应的输入输出流
    InputStream is = accept.getInputStream();
    FileOutputStream fos = new FileOutputStream("佩可莉姆-server.png");

    //4.读取接受的数据,并写入本地文件
    byte[] bbuf = new byte[1024];
    int len;
    while ((len = is.read(bbuf)) != -1) {
    fos.write(bbuf, 0, len);
    }

    //-------------------------------------------
    //5.向客户端进行反馈
    OutputStream os = accept.getOutputStream();
    os.write("照片收到啦!-- by:服务器".getBytes());

    //6.资源关闭
    os.close();
    fos.close();
    is.close();
    accept.close();
    serverSocket.close();
    //7.省略了try-catch-finally处理
    }

三、UDP网络编程

  • 需要DatagramSocket类,来表示发送端/接收端
  • 需要DatagramPacket对数据进行封装,发送,接受
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    //发送端
    @Test
    public void send() throws IOException {
    DatagramSocket socket = new DatagramSocket();

    //将发送数据的信息都封装在一个包上
    byte[] data = "我是UDP方式发送的数据!".getBytes();
    InetAddress localHost = InetAddress.getLocalHost();
    DatagramPacket packet = new DatagramPacket(data, 0, data.length, localHost, 9090);

    //发送数据
    socket.send(packet);

    //关闭资源
    socket.close();
    }

    //接收端
    @Test
    public void receiver() throws IOException {
    DatagramSocket socket = new DatagramSocket(9090);

    //创建一个包,来接受数据
    byte[] buffer = new byte[100];
    DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

    //等待接受
    socket.receive(packet);

    //将接受的资源打印
    System.out.println(new String(packet.getData(), 0, packet.getLength()));

    //关闭资源
    socket.close();
    }

四、URL网络编程

  • URL(Uniform Resoursce Locator):统一资源定位符
  • URL结构:<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
  • URL实例化:URL url = new URL(String url);
  • URL常用方法:
    • pulic String getProtocol():获取该URL的协议名
    • public String getHost():获取该URL的主机名
    • public String getPort():获取该URL的端口号
    • public String getPath():获取给URL的文件路径
    • public String getFIle():获取该URL的文件名
    • public String getQuery():获取该URL的查询名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Test
public void download() throws Exception {
//创建URL连接对象
URL url = new URL("https://i0.hdslb.com/bfs/album/6d2b77cd835f0789e8de0f23618d8b396e304aa9.jpg");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

//连接服务器
urlConnection.connect();

//创建输入、输出流
InputStream is = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("鹿乃.jpg"));

//对数据进行读写
byte[] bbuf = new byte[1024];
int len;
while ((len = is.read(bbuf)) != -1){
fos.write(bbuf, 0, len);
}

//资源关闭
is.close();
fos.close();
urlConnection.disconnect();

//省略了try-catch-finally异常处理
}