zoukankan      html  css  js  c++  java
  • 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();
    
    
            }
    }
    
  • 相关阅读:
    Maven 集成Tomcat插件
    dubbo 序列化 问题 属性值 丢失 ArrayList 解决
    docker 中安装 FastDFS 总结
    docker 从容器中拷文件到宿主机器中
    db2 相关命令
    Webphere WAS 启动
    CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
    SpringMVC JSONP JSON支持
    CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
    git回退到远程某个版本
  • 原文地址:https://www.cnblogs.com/tsruixi/p/14320596.html
Copyright © 2011-2022 走看看