网络编程入门

网络编程

1.1概述

网络编程的目的:

实现信息交互

达到目的需要什么条件?

  1. 如何准确定位一台主机:IP

  2. 如何定位计算机上资源:端口

  3. 如何传输数据:

    java web: B/S架构

    应用:C/S架构

1.2网络通讯的要素

1.通信双方的地址:

  • IP
  • 端口号

2.网络通信协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyhxaGwg-1587999171269)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413205720049.png)]

1.3 IP

ip地址:

  • 唯一定位一台网络上的计算机

  • 分类

    1. IPV4 :4个字节组成, 0~255, 约42亿个(亚洲只有4亿,不公平)
    2. IPV6 :128位 , 8个无符号整数fe80::c0c0:ba57:fe79:a2a913
    3. 公网:用于互联网
    4. 私网:用于局域网
      1. 192.168.xxx.xxx属于局域网
    5. 域名:用于记忆IP(越短越贵,超贵)
  • package com.mrh.net;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    /**
     * TestInetAddress
     * 测试IP
     * 2020/4/13 21:18
     **/
    public class TestInetAddress {
        public static void main(String[] args) {
            try{
                //根据域名或IP查询地址
                InetAddress inetAddress1 = InetAddress.getByName("www.baidu.com");
                System.out.println(inetAddress1);
                //www.baidu.com/183.232.231.174
    
                System.out.println(inetAddress1.getHostAddress());
                //183.232.231.174
    
                System.out.println(inetAddress1.getHostName());
                //www.baidu.com
    
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
        }
    }
    

1.4 端口

端口标识计算机上得一个程序的进程

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

  • 0~65535

  • 端口分类

    • 公用端口0~1023
      • HTTP : 80
      • HTTPS : 443
      • FTP : 21
      • Telent : 23
    • 程序注册端口:1024~49151,分配用户或程序
      • tomcat : 8080
      • Mysql : 3306
      • Oracle : 1521
    • 动态/私有: 49152~65535
    netstat -ano #查看所有端口
    
    netstat -ano|findstr “5900”  #查看指定端口
    
    tasklist|findstr “8696” #查看指定端口进程
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4t714x5-1587999171271)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413214805088.png)]

1.5 通信协议

协议:约定的规则

TCP/IP协议簇

  • TCP : 用户传输协议
  • UDP:数据报传输协议
  • IP:网络互连协议
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GRj7YLY-1587999171272)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413215244643.png)]

TCP UDP对比

TCP:打电话

  • 连接,稳定
  • 传输完成,释放连接,效率低
  • 三次握手,四次挥手
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8flK62Xv-1587999171273)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413220117551.png)]
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MH0oUDi-1587999171275)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413220139037.png)]
  • 客户端,服务端

UDP:发短信

  • 不链接,不稳定
  • 客户端,服务端没有明确界限
  • 不管有没有准备都可以发给你
  • 不安全(饱和攻击)

1.6 TCP

TCP实现聊天

package com.mrh.net;

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

/**
 * TestSocketAddress
 * 测试客户端
 * 2020/4/13 21:38
 **/
public class TestClientDemo1 {
    public static void main(String[] args) throws IOException {

        //1.要知道服务器地址
        InetAddress inetAddress = InetAddress.getByName("localhost");
        int port = 9999;
        //2.创建一个socket连接
        Socket socket = new Socket(inetAddress, port);
        //3.发送消息 IO流
        OutputStream os = socket.getOutputStream();
        os.write("你好,我是帅比".getBytes());

        //关闭流
        if(os != null) {
            os.close();
        }
        if(socket != null) {
            socket.close();
        }

    }
}

package com.mrh.net;

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

/**
 * TestServerDemo1
 * 2020/4/13 22:05
 * 测试服务端
 **/
public class TestServerDemo1 {
    public static void main(String[] args) throws IOException {

        //1.要有一个地址
        ServerSocket serverSocket = new ServerSocket(9999);
        //等待客户端
        Socket socket = serverSocket.accept();
        //读取客户端信息
        InputStream is = socket.getInputStream();
        //管道流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1){
            baos.write(buffer ,0, len);
        }
        System.out.println(baos.toString());

        //关闭流
        if(baos != null) {
            baos.close();
        }
        if(is != null) {
            is.close();
        }
        if(socket != null) {
            socket.close();
        }
        if(serverSocket != null) {
            serverSocket.close();
        }

    }
}

文件上传

Tomcat

服务端

  • 自定义
  • Tomcat

客户端

  • 自定义
  • 浏览器

1.7 UDP

UDP实现聊天

package com.mrh.net;

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

/**
 * TalkReceive
 * 接收线程
 * 2020/4/16 21:48
 **/
public class TalkReceive implements Runnable{
    DatagramSocket socket = null;
    private int myPort;
    private String msgFrom;

    public TalkReceive(int myPort, String msgFrom) throws SocketException {
        this.myPort = myPort;
        this.msgFrom = msgFrom;
        socket = new DatagramSocket(myPort);
    }

    @Override
    public void run() {

        while (true){
            try {
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container,0,container.length);
                socket.receive(packet);

                byte[] data = packet.getData();
                String receiveData = new String(data,0,data.length);

                System.out.println(msgFrom +": "+ receiveData);

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

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}
package com.mrh.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

/**
 * TalkSend
 * 发送线程
 * 2020/4/16 21:26
 **/
public class TalkSend implements Runnable{
    DatagramSocket socket = null;
    BufferedReader reader = null;

    private int myPort;
    private int toPort;
    private String toIp;

    public TalkSend(int myPort, int toPort, String toIp) throws SocketException {
        this.myPort = myPort;
        this.toPort = toPort;
        this.toIp = toIp;

        socket = new DatagramSocket(myPort);
        reader = new BufferedReader(new InputStreamReader(System.in));
    }

    @Override
    public void run() {

        while (true){
            try {
                String data = reader.readLine();
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIp,this.toPort));
                socket.send(packet);
                if("bye".equals(data)){
                    break;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

1.8 URL

https://www.baidu.com/

统一资源定位器:定位互联网上的某一资源

DNS域名解析 : 域名–>ip

1.协议://ip:端口/项目/资源

下载网络资源

package com.mrh.net;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * URLDemo01
 * 下载网络资源
 * 2020/4/16 22:15
 **/
public class URLDemo01 {
    public static void main(String[] args) throws IOException {
        //1.下载地址
        URL url = new URL("https://m10.music.126.net/20200416230043/5e6b78442733cd0c96f06481229c7948/yyaac/0052/005b/020f/788cff545371798931095e7e20a8d781.m4a");

        //2.连接网络资源
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();

        FileOutputStream fos = new FileOutputStream("1.m4a");

        //输出数据
        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer))!= -1){
            fos.write(buffer,0,buffer.length);
        }

        //关闭流
        fos.close();
        inputStream.close();
        urlConnection.disconnect(); // 断开连接

        /*System.out.println(url.getFile());
        System.out.println(url.getHost());
        System.out.println(url.getPath());
        System.out.println(url.getFile());*/

    }
}
因为我喜欢追寻过程中的自己
原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359784.html