• 渚漪Day02——网络编程【模拟C/S图片传输】


    网络编程

    1.1、概述

    网络编程的目的:

    传播交流信息,数据交换,通讯

    想要达到的效果

    1. 如何准确的定为网络上的一台主机 地址+端口
    2. 找到主机后,如何传输数据?

    javaweb:网页编程 B/S 浏览器/服务器
    网络编程:TCP/IP C/S 客户机/服务器

    1.2、网络通信的要素

    如何实现网络的通信?

    通信双方的地址:

    • ip

    • 端口号

    规则:网络通信协议

    ↑转自大佬截图

    1.3、IP

    ip地址:InetAddress

    • 唯一定为一台网络上计算机
    • 127.0.0.1: 本机localhost
    • ip地址的分类
      • ipv4/ipv6
        • Ipv4 : 4个字节组成。0~255,42亿
        • Ipv6: fe80::bc5e:bbfb:6f45:a2b%10 ,128位,8个无符号整数
      • 公网(互联网)-私网(局域网)
        • ABCD类
        • 192.168.xx.xx 专门给组织内部使用
      • 域名:记忆ip问题

    1.4、端口

    1.5、通讯协议

    TCP UDP对比**

    TCP:打电话

    UDP:发短信

    • 不连接、不稳定
    • 不管是否准备都能发送

    1.6、TCP

    1.6.1、TCP

    客户端

    1. 连接服务器Socket
    2. 发送消息

    服务器

    1. 建立服务端口SeverSocket
    2. 等待用户连接accept
    3. 接收用户的消息

    文件上传

    代码(客户端)

    package lesson1;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    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("kano.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.关闭资源
            os.close();
            socket.close();
        }
    }
    
    

    代码(服务器)

    package lesson1;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    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();
            FileOutputStream fos = new FileOutputStream(new File("F:/现在/かの/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());
            System.out.println("结束!");
            //关闭资源
            fos.close();
            is.close();
            socket.close();
            serverSocket.close();
    
        }
    }
    
    

    效果图片

    开始阶段,左侧工程文件夹有图片kano.jpg 右侧为存放图片的目标文件夹

    执行阶段,先执行server(服务器)代码,再执行client(客户端)代码

    结果图片

    右侧成功接收receive.jpg 图片

  • 相关阅读:
    JavaScript内置对象String对象下常用的方法
    JavaScript内置对象String对象
    JavaScript内置对象Math产生一个16进制的随机颜色值
    JavaScript内置对象Math查询一组数中的最大值
    JavaScript内置对象Date常用方法总结
    JavaScript内置对象Date常用函数
    JavaScript内置对象Date----格式化时间
    C++学习笔记30:模板与型式参数化
    C++学习笔记29:运行期型式信息2
    C++学习笔记28:运行期型式信息
  • 原文地址:https://www.cnblogs.com/ijuysama/p/12655109.html
Copyright © 2020-2023  润新知