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();


        }
}
posted @ 2021-01-24 13:08  睿晞  阅读(155)  评论(0编辑  收藏  举报