网络编程

网络编程

1.1概述

计算机网络:

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

网络编程的目的

数据交互,通信

想要达到这个效果需要什么:

  1. 如何准确的定位网络上的一台主机 ip地址:端口, 定位到计算机上的某个资源

  2. 找到主机后如何传输数据

     

javaweb: 网页编程 B/S

网络编程: TCP/IP

1.2网络通信的要素

如何实现网络的通信?

通信双方地址

  • ip

  • 端口号

  • 192.168.16,124:5900

规则:网络通信协议

TCP/IP参考模型

小结:

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

    • 如何精准的定位到网络上的一台或者多太主机

    • 找到主机之后如何进行通信

  2. 网络编程中的要素

    • ip和端口号 ip

    • 网络通信协议. udp tcp

  3. 万物皆对象

     

1.3 IP

ip地址: InetAddress

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

  • 127.0.0.1: 本机 localhost

  • ip地址分类

    • ipv4/ipv6

      • ipv4 127.0.0.1 四个字节组成 0~255, 42亿

      • ipv6 128位 八位无符号整数

    • 公网(互联网)-私网(局域网)

      • 192.168.xx.xx(局域网ip)专门给组织内部使用

阿里笔试题:ip地址的ABCD分类.

1.4端口

端口表示计算机上的一个进程

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

  • 端口规定 0-6535

  • TCP,UDP: 6535*2 单个协议下端口号不能冲突

  • 端口分类

    • 共有端口 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" #查看指定端口的进程
       Ctrl +Shift +Esc #查看任务管理器

       

 package com.kuang.lesson01;
 
 import java.net.InetSocketAddress;
 
 public class TestInetSocketAddress {
     public static void main(String[] args) {
         InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8080);
         InetSocketAddress inetSocketAddress1 =  new InetSocketAddress("localhost",8080);
         System.out.println(inetSocketAddress.toString());
         System.out.println(inetSocketAddress1.toString());
 
         System.out.println(inetSocketAddress.getAddress());
         System.out.println(inetSocketAddress.getHostName());    //地址
         System.out.println(inetSocketAddress.getPort());        //端口
    }
 }
 

1.5 通信协议

协议: 约定

网络通信协议:

速率,传输码率,代码结构,传输控制

TCP/IP协议簇

重要:

 * TCP:用户传输协议
 * UDP:用户数据报协议
 * IP:网络互连协议

TCP UDP对比

TCP:打电话

 * 连接 稳定
 * 三次握手 四次挥手
 * 客户端 服务端
 * 传输完成,释放链接,效率低

UDP:发短信

 * 不连接,不稳定
 * 客户端,服务的:没有明确界限
 * 不管有没有准备好,都可以发给你...
 * DDOS:洪水攻击(饱和攻击),造成端口堵塞

1.6 TCP

文件上传

客户端

 package com.kuang.lesson02;
 
 import java.io.*;
 import java.net.InetAddress;
 import java.net.Socket;
 import java.net.UnknownHostException;
 
 public class TcpClientDemo02 {
     public static void main(String[] args) throws Exception {
         //创建socket连接
         Socket socket= new Socket(InetAddress.getByName("127.0.0.1"),9000);
         //创建输出流
         OutputStream os = socket.getOutputStream();
         //文件流
         FileInputStream fis = new FileInputStream(new File("sy.jpg"));
         //写出文件
         byte[] buffer = new byte[1024];
         int len;
         while ((len=fis.read(buffer))!=-1){
             os.write(buffer,0,len);
        }
         //通知服务器,传输完毕
         socket.shutdownOutput();
         //确认服务器接收完毕,断开连接
         InputStream inputStream = socket.getInputStream();
         //String byte[]
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         byte[] buffer2 = new byte[1024];
         int len2;
         while ((len2=inputStream.read(buffer2))!=-1){
             baos.write(buffer2,0,len2);
        }
         System.out.println(baos.toString());
         //5.关闭资源
         baos.close();
         inputStream.close();
         fis.close();
         os.close();
         socket.close();
    }
 }
 

 

服务端

 package com.kuang.lesson02;
 
 import java.io.*;
 import java.net.ServerSocket;
 import java.net.Socket;
 
 public class TcpServerDemo02 {
     public static void main(String[] args) throws Exception {
         //创建服务
         ServerSocket serverSocket = new ServerSocket(9000);
         //创建客户端的连接
         Socket socket = serverSocket.accept(); //阻塞式监听,会一直等待客户端连接
         //获取输入流
         InputStream is = socket.getInputStream();
         //文件输出
         FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
         byte[] buffer = new byte[1024];
         int len;
         while ((len=is.read(buffer))!=-1){
             fos.write(buffer,0,len);
        }
         //通知客户端,服务器接收完毕
         OutputStream os = socket.getOutputStream();
         os.write("接收完毕".getBytes());
         //关闭资源
         fos.close();
         is.close();
         socket.close();
         serverSocket.close();
    }
 }
 

Tomcat

服务端

 * 自定义 S
 * Tomcat服务器 S: Java后台开发

客户端

* 自定义 C
* 浏览器 B

Tomcat 终端启动后出现的乱码问题是因为windows默认的是GBK编码,不是utf-8,在config中的logging.properties中可以修改

1.7 UDP

类似于发短信:不用连接,但需要指导对方的地址

发送消息

发送端

package com.kuang.lesson03;

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

//不需要连接服务器
public class UdpClientDemo01 {
    public static void main(String[] args) throws Exception {
        //1.建立一个Socket
        DatagramSocket socket = new DatagramSocket();
        //2.发送包
        String msg = "你好,服务器";
        //发送地址
        InetAddress address = InetAddress.getByName("localhost");
        int port = 9090;
        //数据,数据的长度起始,发送地址
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,address,port);
        //发送包
        socket.send(packet);
        //关闭流
        socket.close();
    }
}

接收消息

接收端

package com.kuang.lesson03;

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

public class UdpServerDemo01{
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(9090);
        //接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        //阻塞接收
        socket.receive(packet);
        //处理数据
        System.out.println(packet.getPort());
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //关闭连接
        socket.close();


    }
}

循环发送消息

package com.sy.chat;

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

public class UdpSender {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(8888);
        //准备数据
        Scanner input = new Scanner(System.in);
        while (true){
            String data = input.nextLine();
            byte[] datas = data.getBytes();
            DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
            socket.send(packet);
            if ("bye".equals(data)){
                break;
            }
        }
        socket.close();
    }
}

循环接收消息

package com.sy.chat;

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

public class UdpReciver {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(6666);
        while (true){
            //接收包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container,0,container.length);
            socket.receive(packet);
            //断开连接
            byte data[] = packet.getData();
            String receiveDatas = new String(data,0,data.length);
            System.out.println(receiveDatas);
            if ("bye".equals(receiveDatas)){
                break;
            }
        }
        socket.close();
    }
}

在线咨询

两个人都是发送方,也都是接收方

1.8 URL

统一资源定位符: 定位资源.定位互联网上的某一个资源

DNS 域名解析 www.baidu.com 和 xxx.xx.xx.x 本质上是一个东西

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

爬虫

package com.sy.lesson04;

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

public class URLDown {
    public static void main(String[] args) throws Exception {
        //1.下载地址
        URL url = new URL("https://m10.music.126.net/20201001145511/3e2a0b7db30091aa19fc939c96b8864e/yyaac/obj/wonDkMOGw6XDiTHCmMOi/1682376542/7f8b/9ccf/4125/d5897bb189b0cc3e00f2f7dcc0c56239.m4a");
        //2.链接到这个资源 HTTP
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fos = new FileOutputStream("海底.mp4");
        byte[] buffer = new byte[1024];
        int len;
        while((len=inputStream.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        fos.close();
        inputStream.close();
        urlConnection.disconnect();

    }
}

 

posted @ 2020-10-14 17:13  relo  阅读(389)  评论(0)    收藏  举报