Java 网络编程 学习笔记(2021.10.18)

网络编程

一、什么是计算机网络

1.1 概述

地球村:你在北京,有一个西班牙的朋友

类似于邮件流转:有自己的地址和对方的地址和内容等等

image

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统网络管理软件网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程的目的:无线电台,传播交流信息,数据交换,通信

想达到这个效果需要什么

  1. 定位主机:192.168.15.13: 端口,定位这个计算机上的某个资源
  2. 如何找到主机?

javaweb: 网页编程 B/S

网络编程: 客户端编程 C/S

二、网络通信的两个要素

如何实现网络通信

通信双方地址:

  • ip
  • 端口

网络通信的规则:协议

TCP/IP模型:

image

网络编程中有两个主要的问题:

  1. 如何准确定位一台或多台主机
  2. 找到主机后如何通信

网络通信中的要素:

  1. ip和端口号
  2. 网络通信协议udp、tcp

万物皆对象

三、IP地址

ip地址:InetAddress

  • 一个ip地址能准确只找到一台主机

  • 本机地址:127.0.0.1

  • ip地址分类

    • ipv4/ipv6

      • IPv4 127.0.0.1 ,四个字节组成,0~255,一共42亿,三十亿都在北美,2011用尽

      • IPv6 fe80::c46e:e3a3:20fd:8eba%13 ,128位,八个无符号整数

      • 2001:2156:a2c5:6598:ad24:ddd3:253a:1281
        
    • 公网-私网

      • ABCD类地址
      • 192.168.xxx.xxx,专门给组织内部用的

demo:

package com.xiaowei9s.NetLearn;

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

//测试ip
public class TestIPAddress {
    public static void main(String[] args) throws UnknownHostException {
        //查询本机地址
        InetAddress ip1 = InetAddress.getByName("127.0.0.1");
        System.out.println(ip1);
        InetAddress ip2 = InetAddress.getByName("localhost");
        System.out.println(ip2);
        InetAddress ip3 = InetAddress.getLocalHost();
        System.out.println(ip3);

        //查询网站ip地址
        InetAddress ipw = InetAddress.getByName("www.baidu.com");
        System.out.println(ipw);

        //常用方法
        System.out.println(ipw.getHostAddress());//获得ip
        System.out.println(ipw.getCanonicalHostName());//获得规范名
        System.out.println(ipw.getHostName());//获得域名
        //System.out.println(ipw.getAddress());
    }
}

四、端口Port

表示计算机上一个程序的进程。

  • 不同的进程有不同的端口号!用来区分软件

  • 被规定位0~65535

  • TCP/UDP 各自端口不冲突,TCP可以为80的同时UDP也可以是80,但是不能有相同协议的两个进程使用同一个端口

  • 端口分类

    • 公有端口:1~1023

      • HTTP 80
      • HTTPS 443
      • FTP 21
      • Telent 23
    • 程序注册端口1024~49151,分配给用户或程序

      • tomcat 8080
      • Mysql 3306
      • Oracle 1521
    • 动态、私有:49152~66535

    • netstat -ano #查看所有端口
      netstat -ano|findstr "5353" #查看指定端口
      tasklist|findstr "5353" #查看指定端口进程
      
  • package com.xiaowei9s.NetLearn;
    
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    import java.net.SocketAddress;
    import java.net.UnknownHostException;
    
    //测试ip
    public class TestIPAddressPort {
        public static void main(String[] args) throws UnknownHostException {
            InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8081);
            InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost", 8081);
            System.out.println(inetSocketAddress);
            System.out.println(inetSocketAddress2);
            System.out.println(inetSocketAddress2.getAddress());
            System.out.println(inetSocketAddress2.getPort());
            System.out.println(inetSocketAddress2.getHostName());
            System.out.println(inetSocketAddress2.getHostString());
    
        }
    }
    

五、通信协议

协议:约定,解决怎么做的问题,比如大家商量出一个协议如:广场协议,规定了哪个国家必须怎么做

网络通信协议:TCP/IP,协定了速率、传输码率、代码结构、传输控制......

问题:很复杂吗?

大事化小:分层!

TCP/IP协议簇

重要:

  • TCP:用户传输协议
  • UDP:用户数据包协议

出名的协议:

  • TCP
  • IP:网络互联协议

TCP/UDP对比:

TCP:打电话

  • 连接、稳定

  • 三次握手 四次挥手

    三次握手:我呼叫你,你回答,我表示可以交流了(三次)

    四次挥手:我说我要走了,你回应说知道了,我说byebye并且真的走了,你也说byebye然后也走了(四次)

  • 客户端、服务端

  • 传输完成释放连接

UDP:发短信

  • 不连接、不稳定
  • 客户端服务端:没有明确界限
  • 不管有没有准备好,都可以发给你
  • 导弹
  • DDOS:洪水攻击(饱和攻击)

六、TCP实现聊天

客户端:

  1. 获取服务器地址
  2. 连接服务器
  3. 发送消息
package com.xiaowei9s.lesson2;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        //获得地址
        InetAddress ipaddress = InetAddress.getByName("127.0.0.1");
        //连接服务器
        Socket socket = new Socket(ipaddress, 8888);
        //发送信息流
        OutputStream os = socket.getOutputStream();
        os.write("你好服务器".getBytes());
        if (os!=null){
            os.close();
        }
        if (socket!=null){
            socket.close();
        }
    }
}

服务端

  1. 建立服务端口
  2. 等待用户连接accept
  3. 接收消息
package com.xiaowei9s.lesson2;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) throws Exception {
        //建立端口
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket accept = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        //持续接收信息
        while (true){
            //等待连接
            accept = serverSocket.accept();

            //接收信息流
            is = accept.getInputStream();

            //管道写信息
            baos = new ByteArrayOutputStream();
            int len;
            byte[] buffer = new byte[1024];
            while ((len = is.read(buffer)) != -1){
                baos.write(buffer,0,len);
            }
            System.out.println(baos);
            if (baos!=null){
                baos.close();
            }
            if (is!=null){
                is.close();
            }
            if (accept!=null){
                accept.close();
            }
        }
    }
}

七、TCP实现文件上传

客户端:

  1. 获取服务器地址
  2. 连接服务器
  3. 获得图片
  4. 发送图片
package com.xiaowei9s.lesson3;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TCPClientFile {
    public static void main(String[] args) throws IOException {
        //获得地址
        InetAddress ipaddress = InetAddress.getByName("127.0.0.1");
        //连接服务器
        Socket socket = new Socket(ipaddress, 8888);
        //获得发送信息流
        OutputStream os = socket.getOutputStream();
        //获得文件
        FileInputStream fis = new FileInputStream(new File("1.png"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1){
            os.write(buffer,0,len);
        }

        if (os!=null){
            os.close();
        }
        if (socket!=null){
            socket.close();
        }
    }
}

服务端

  1. 建立服务端口
  2. 等待用户连接accept
  3. 接收并且保存图片
package com.xiaowei9s.lesson3;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerFile {
    public static void main(String[] args) throws Exception {
        //建立端口
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket accept = null;
        InputStream is = null;
        FileOutputStream fos =  null;
        //持续接收信息
        while (true){
            //等待连接
            accept = serverSocket.accept();

            //接收信息流
            is = accept.getInputStream();

            //管道写信息
            fos = new FileOutputStream("receive.png");
            int len;
            byte[] buffer = new byte[1024];
            while ((len = is.read(buffer)) != -1){
                fos.write(buffer,0,len);
            }
            if (fos!=null){
                fos.close();
            }
            if (is!=null){
                is.close();
            }
            if (accept!=null){
                accept.close();
            }
        }
    }
}

八、初识Tomcat

服务端

  • 自定义 S
  • Tomcat S

客户端

  • 自定义 C
  • 浏览器 B

九、UDP信息发送

udp像是发信息,不需要连接到服务器,直接能发

客户端:

  1. 获得地址
  2. 制造包
  3. 发送包
  4. 关闭流
package com.xiaowei9s.lesson4;

import java.net.*;

public class UDPClient {
    public static void main(String[] args) throws Exception {
        //获得地址
        InetAddress ip = InetAddress.getByName("127.0.0.1");
        int port = 8111;
        DatagramSocket datagramSocket = new DatagramSocket();

        //制造数据包
        String msg = "你好呀!";
        DatagramPacket datagramPacket = new DatagramPacket(
                msg.getBytes(), 0, msg.getBytes().length,ip,port);

        //发送消息
        datagramSocket.send(datagramPacket);

        //关闭流
        datagramSocket.close();

    }
}

服务端:

  1. 开放端口
  2. 弄个容器
  3. 容器接收信息
  4. 输出内容
  5. 关闭流
package com.xiaowei9s.lesson4;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPServer {
    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket ds = new DatagramSocket(8111);

        //弄个容器装包
        byte[] bytes = new byte[1024];
        DatagramPacket pa = new DatagramPacket(bytes, 0, bytes.length);

        //获取内容
        ds.receive(pa);

        //输出内容
        System.out.println(new String(pa.getData()));

        //关闭流
        ds.close();
    }
}

十、多线程在线咨询

循环发送:

package com.xiaowei9s.chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class TalkSend implements Runnable{


    int formPort;
    int toPort;
    DatagramSocket datagramSocket = null;
    InetAddress toIp = null;
    BufferedReader reader = null;

    public TalkSend(int formPort, int toPort, String toIp) {
        this.formPort = formPort;
        this.toPort = toPort;
        try {
            this.datagramSocket = new DatagramSocket(formPort);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            this.toIp = InetAddress.getByName(toIp);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        this.reader = reader;
    }

    @Override
    public void run() {

        while (true){
            //获得输入信息
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            //制造数据包
            String msg = null;
            try {
                msg = reader.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            DatagramPacket datagramPacket = new DatagramPacket(
                    msg.getBytes(), 0, msg.getBytes().length,toIp,toPort);

            //发送消息
            try {
                datagramSocket.send(datagramPacket);
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (new String(datagramPacket.getData()).equals("bye")){
                break;
            }
        }

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

循环接收:

package com.xiaowei9s.chat;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TalkReceive implements Runnable{
    String msgForm;
    int port;
    DatagramSocket ds = null;

    public TalkReceive(int port,String msgForm) {
        this.msgForm = msgForm;
        this.port = port;
        try {
            ds = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void run() {
        //弄个容器装包
        while (true){
            byte[] bytes = new byte[1024];
            DatagramPacket pa = new DatagramPacket(bytes, 0, bytes.length);

            //获取内容
            try {
                ds.receive(pa);
            } catch (IOException e) {
                e.printStackTrace();
            }

            //输出内容
            String msg = new String(pa.getData(),0,pa.getLength());
            System.out.println(msgForm+":"+msg);

            if (msg.equals("bye")){
                break;
            }
        }


        //关闭流
        ds.close();
    }
}

老师:

package com.xiaowei9s.chat;

public class TalkTea {
    public static void main(String[] args) {

        new Thread(new TalkReceive(7777,"学生")).start();
        new Thread(new TalkSend(8888,9999,"localhost")).start();
    }
}

学生:

package com.xiaowei9s.chat;

public class TalkStu {
    public static void main(String[] args) {
        new Thread(new TalkReceive(9999,"老师")).start();
        new Thread(new TalkSend(6666,7777,"localhost")).start();

    }
}

十一、URL下载网络资源

URL:统一资源定位符

package com.xiaowei9s.url;

import java.net.MalformedURLException;
import java.net.URL;

public class TestURL {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://127.0.0.1:8080/xiaowei9s/red.txt");
        System.out.println(url.getHost());
        System.out.println(url.getPort());
        System.out.println(url.getAuthority());
        System.out.println(url.getFile());
        System.out.println(url.getQuery());
        System.out.println(url.getProtocol());
    }
}

下载网络资源:

package com.xiaowei9s.url;

import javax.net.ssl.HttpsURLConnection;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class TestDownLoad {
    public static void main(String[] args) throws IOException {
        URL url = new URL("http://127.0.0.1:8080/xiaowei9s/red.txt");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStream is = connection.getInputStream();

        FileOutputStream os = new FileOutputStream(new File("red.m4d"));

        byte[] bytes = new byte[1024];
        int len;
        while ((len = is.read(bytes))!=-1){
            os.write(bytes);
        }
        os.close();
        is.close();
        connection.disconnect();

    }
}

知识来源:kuangstudy.com

posted @ 2021-10-18 21:46  小阴辨  阅读(91)  评论(0)    收藏  举报