• Java基础-网络编程


    一、网络编程

    1.1、概述

    1. javaweb: 网页编程 B/S
    2. 网络编程: TCP/IP C/S

    1.2、网络通信的要素

    1. 如何实现网络通信
      • IP
      • 端口号
      • 网络通信协议

    1.3、IP

    1. ip地址:InetAddress
      • 127.0.0.1:本机localhost
      • ip地址分类
        • ipV4,4个字节,0~255
        • ipV6,128位,8个无符号数整数
      • 公网(互联网)-私网(局域网)
        • ABCD类地址
        • 192.168.xx.xx专门给组织内部使用的
      • 域名:记忆IP问题
        • IP:www.vip.com

    1.4、端口

    1. 端口表示计算机上一个程序的进程:
      • 不同的进程有不同的端口号,用来区分软件
      • 被规定是0~65535
      • TCP,UDP:65535 * 2 tcp:80,udp:80,单个协议下端口号不能够冲突
      • 端口分类:
        • 公有端口0~1023
          • HTTP:80
          • HTTPS:443
          • FTP:21
          • Telent:23
        • 程序注册端口:
          • Tomcat:8080
          • MySQL:3306
          • Oracle:1521
        • 动态、私有:49152~65535
        • netstat -ano 查看所有端口

    1.5、通信协议

    1. 网络通信协议: 速率、传输码率、代码结构、传输控制
    2. TCP/IP协议簇
      • TCP:用户传输协议
      • UDP:用户数据报协议
      • IP:网络互连协议

    3. TCP、UDP对比:

    TCP:打电话

    • 连接稳定
    • 三次握手 四次挥手
    • image-20210118165347505
    • 客户端、服务端
    • 传输完成、释放连接、效率低

    UDP:发短信

    • 不连接、不稳定
    • 客户端、服务端:没有明显界限
    • 不管有没有准备好,都可以发给你

    1.6、TCP

    客户端:

    1. 连接服务器Socket
    2. 发送消息
    3. 代码:
    package com.ruixi.net;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.nio.charset.StandardCharsets;
    
    /**
     * @Author: ruixi
     * @Date: 2021/1/18 17:26
     */
    public class TcpClientDemo01 {
            public static void main(String[] args) {
                    Socket socket = null;
                    OutputStream os = null;
                    try{
                            //1. 端口、地址
                            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
                            int port = 9999;
                            //2.创建一个socket连接
                            socket = new Socket(serverIP, port);
                            //3.发送IO流
                            os = socket.getOutputStream();
                            os.write("你好,欢迎学习Java".getBytes());
                    } catch (IOException e) {
                            e.printStackTrace();
                    }finally {
                            if(os != null){
                                    try{
                                            os.close();
                                    }catch (IOException e){
                                            e.printStackTrace();
                                    }
                            }
                            if(socket != null){
                                    try{
                                            socket.close();
                                    }catch (IOException e){
                                            e.printStackTrace();
                                    }
                            }
                    }
            }
    }
    

    服务器:

    1. 建立服务的端口
    2. 等待用户的链接accept
    3. 接收用户的消息
    4. 代码:
    package com.ruixi.net;
    
    import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @Author: ruixi
     * @Date: 2021/1/18 17:26
     */
    public class TcpServerDemo01 {
            public static void main(String[] args) throws IOException {
                    ServerSocket serverSocket = null;
                    Socket socket = null;
                    InputStream is = null;
                    ByteArrayOutputStream baos = null;
    
                    try{
                            //1. 地址
                             serverSocket = new ServerSocket(9999);
    
                             while(true){
                                     //2. 等待客户端连接过来
                                     socket = serverSocket.accept();
                                     //3. 读取客户端的消息
                                     is = socket.getInputStream();
    
                                     //管道流
                                     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());
                             }
                    }catch(IOException e){
                            e.printStackTrace();
                    }finally{
                            if(baos != null){
                                    try{
                                            baos.close();
                                    }catch (IOException e){
                                            e.printStackTrace();
                                    }
                            }
                            if(is != null){
                                    try{
                                            is.close();
                                    }catch (IOException e){
                                            e.printStackTrace();
                                    }
                            }
                            if(socket != null){
                                    try{
                                            socket.close();
                                    }catch (IOException e){
                                            e.printStackTrace();
                                    }
                            }
                            if(serverSocket != null){
                                    try{
                                            serverSocket.close();
                                    }catch (IOException e){
                                            e.printStackTrace();
                                    }
                            }
                    }
            }
    }
    

    1.7、文件上传

    1. 客户端代码:
    package com.ruixi.net;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @Author: ruixi
     * @Date: 2021/1/18 19:21
     */
    public class TcpClientDemo02 {
            public static void main(String[] args) throws Exception{
                    //1. 创建一个Socket连接
                    Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
                    //2. 创建一个输出流
                    OutputStream os = socket.getOutputStream();
                    //3. 读取文件
                    FileInputStream fis = new FileInputStream(new File("01.jpg"));
                    //4. 写出文件
                    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();
            }
    }
    
    1. 服务端代码:
    package com.ruixi.net;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.nio.charset.StandardCharsets;
    
    /**
     * @Author: ruixi
     * @Date: 2021/1/18 19:22
     */
    public class TcpServerDemo02{
            public static void main(String[] args) throws Exception{
                    //1. 创建服务
                    ServerSocket serverSocket = new ServerSocket(9000);
                    //2. 监听客户端的连接
                    Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
                    //3. 获取输入流
                    InputStream is = socket.getInputStream();
    
                    //4. 文件输出
                    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());
    
                    //5. 关闭资源
                    fos.close();
                    is.close();
                    socket.close();
                    serverSocket.close();
            }
    }
    

    1.8UDP

    1.9URL

    • 统一资源定位符:定位资源的,定位互联网上的某一个资源
    • 协议://ip地址:端口/项目名/资源
    • 代码:
    package com.ruixi.net;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    /**
     * @Author: ruixi
     * @Date: 2021/1/24 11:08
     */
    public class URLDemo01 {
            public static void main(String[] args) throws Exception {
                    //1. 下载地址
                    URL url = new URL("https://m701.music.126.net/20210124115915/ec5ed2a0a8f10aeb12875a673fa8c821/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/4817198751/40fd/f00b/3c46/229497e488fecbb1e921794caf0b283a.m4a");
    
                    //2. 连接到这个资源 HTTP
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    
                    InputStream inputStream = urlConnection.getInputStream();
    
                    FileOutputStream fos = new FileOutputStream("01.m4a");
    
                    byte[] buffer = new byte[1024];
                    int len;
                    while((len = inputStream.read(buffer)) != -1){
                            fos.write(buffer, 0, len);//写出这个数据
                    }
                    fos.close();
                    inputStream.close();
                    urlConnection.disconnect();
    
    
            }
    }
    
  • 相关阅读:
    Codeforces Gym
    洛谷试炼场一句话题解
    优先队列板子
    BZOJ 3524 [POI2014] Couriers/洛谷3567(可持久化线段树)
    hdu 4417 Super Mario(可持久化线段树)
    poj 2559 Largest Rectangle in a Histogram (单调栈)
    zoj 4019 Schrödinger's Knapsack
    hdu 1521 排列组合(指数型生成函数板子)
    hdu 2072 单词数(普通型生成函数板子)
    RabbitMQ广播:direct模式
  • 原文地址:https://www.cnblogs.com/tsruixi/p/14320596.html
Copyright © 2020-2023  润新知