渚漪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 图片

原文地址:https://www.cnblogs.com/ijuysama/p/12655109.html