• 网络编程


    一、网络编程入门

    C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。
    B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。
    TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。
     
    UDP:用户数据报协议(User Datagram Protocol)。UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。
    TCP:传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。 
    • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
    • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
    • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。
     
    查看本机IP地址,在控制台输入:
    ipconfig
    检查网络是否连通,在控制台输入:
    ping 空格 IP地址
    ping 220.181.57.216
    特殊的IP地址
    本机IP地址:127.0.0.1、localhost 

    二、TCP通信程序

    在Java中,提供了两个类用于实现TCP通信程序:
    客户端:java.net.Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
    服务端:java.net.ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

    Socket类

    Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
    Socket client = new Socket("127.0.0.1", 6666);
    
    public Socket(String host, int port)
    public InputStream getInputStream() : 返回此套接字的输入流。
    public OutputStream getOutputStream() : 返回此套接字的输出流。
    public void close() :关闭此套接字。
    public void shutdownOutput() : 禁用此套接字的输出流。

    ServerSocket类

    ServerSocket server = new ServerSocket(6666);
    public ServerSocket(int port)
    public Socket accept() :侦听并接受连接,返回一个新的Socket对象
    
    服务端:
    public class ServerTCP {
        public static void main(String[] args) throws IOException {
            System.out.println("服务端启动 , 等待连接 .... ");
            // 1.创建 ServerSocket对象,绑定端口,开始等待连接
            ServerSocket ss = new ServerSocket(6666);
            // 2.接收连接 accept 方法, 返回 socket 对象.
            Socket server = ss.accept();
            // 3.通过socket 获取输入流
            InputStream is = server.getInputStream();
            // 4.一次性读取数据
              // 4.1 创建字节数组
            byte[] b = new byte[1024];
              // 4.2 据读取到字节数组中.
            int len = is.read(b);
            // 4.3 解析数组,打印字符串信息
            String msg = new String(b, 0, len);
            System.out.println(msg);
              // =================回写数据=======================
              // 5. 通过 socket 获取输出流
               OutputStream out = server.getOutputStream();
              // 6. 回写数据
               out.write("我很好,谢谢你".getBytes());
              // 7.关闭资源.
              out.close();
            is.close();
            server.close();
        }
    }
    
    客户端:
    public class ClientTCP {
        public static void main(String[] args) throws Exception {
            System.out.println("客户端 发送数据");
            // 1.创建 Socket ( ip , port ) , 确定连接到哪里.
            Socket client = new Socket("localhost", 6666);
            // 2.通过Scoket,获取输出流对象 
            OutputStream os = client.getOutputStream();
            // 3.写出数据.
            os.write("你好么? tcp ,我来了".getBytes());
              // ==============解析回写=========================
              // 4. 通过Scoket,获取 输入流对象
              InputStream in = client.getInputStream();
              // 5. 读取数据数据
              byte[] b = new byte[100];
              int len = in.read(b);
              System.out.println(new String(b, 0, len));
            // 6. 关闭资源 .
              in.close();
            os.close();
            client.close();
        }
    }

    三、综合案例

    文件上传案例

    1. 【客户端】输入流,从硬盘读取文件数据到程序中。
    2. 【客户端】输出流,写出文件数据到服务端。
    3. 【服务端】输入流,读取文件数据到服务端程序。
    4. 【服务端】输出流,写出文件数据到服务器硬盘中。
    5. 【服务端】获取输出流,回写数据。
    6. 【客户端】获取输入流,解析回写数据。
     
    服务端:
    public class FileUpload_Server {
        public static void main(String[] args) throws IOException {
            System.out.println("服务器 启动.....  ");
            // 1. 创建服务端ServerSocket
            ServerSocket serverSocket = new ServerSocket(6666);
            // 2. 循环接收,建立连接
            while (true) {
                Socket accept = serverSocket.accept();
                  /*
                  3. socket对象交给子线程处理,进行读写操作
                   Runnable接口中,只有一个run方法,使用lambda表达式简化格式
                */
                new Thread(() -> {
                    try (
                        //3.1 获取输入流对象
                        BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
                        //3.2 创建输出流对象, 保存到本地 .
                        FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
                        BufferedOutputStream bos = new BufferedOutputStream(fis);
                    ) {
                        // 3.3 读写数据
                        byte[] b = new byte[1024 * 8];
                        int len;
                        while ((len = bis.read(b)) != -1) {
                            bos.write(b, 0, len);
                        }
    
                        // 4.=======信息回写===========================
                        System.out.println("back ........");
                        OutputStream out = accept.getOutputStream();
                        out.write("上传成功".getBytes());
                        out.close();
                        //================================
    
                        //5. 关闭 资源
                        bos.close();
                        bis.close();
                        accept.close();
                        System.out.println("文件上传已保存");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
        }
    }
    
    客户端:
    public class FileUpload_Client {
        public static void main(String[] args) throws IOException {
            // 1.创建流对象
            // 1.1 创建输入流,读取本地文件
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg"));
            // 1.2 创建输出流,写到服务端
            Socket socket = new Socket("localhost", 6666);
            BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
    
            //2.写出数据.
            byte[] b  = new byte[1024 * 8 ];
            int len ;
            while (( len  = bis.read(b))!=-1) {
                bos.write(b, 0, len);
            }
              // 关闭输出流,通知服务端,写出数据完毕
            socket.shutdownOutput();
            System.out.println("文件发送完毕");
            // 3. =====解析回写============
            InputStream in = socket.getInputStream();
            byte[] back = new byte[20];
            in.read(back);
            System.out.println(new String(back));
            in.close();
            // ============================
    
            // 4.释放资源
            socket.close();
            bis.close();
        }
    }

    模拟BS服务器

    服务端:
    public class SerDemo {
        public static void main(String[] args) throws IOException {
            System.out.println("服务端  启动 , 等待连接 .... ");
            // 创建ServerSocket 对象
            ServerSocket server = new ServerSocket(8888);
            Socket socket = server.accept();
            // 转换流读取浏览器的请求消息
            BufferedReader readWb = new
            BufferedReader(new InputStreamReader(socket.getInputStream()));
            String requst = readWb.readLine();
            // 取出请求资源的路径
            String[] strArr = requst.split(" ");
            // 去掉web前面的/
            String path = strArr[1].substring(1);
            // 读取客户端请求的资源文件
            FileInputStream fis = new FileInputStream(path);
            byte[] bytes= new byte[1024];
            int len = 0 ;
            // 字节输出流,将文件写会客户端
            OutputStream out = socket.getOutputStream();
            // 写入HTTP协议响应头,固定写法
            out.write("HTTP/1.1 200 OK
    ".getBytes());
            out.write("Content-Type:text/html
    ".getBytes());
            // 必须要写入空行,否则浏览器不解析
            out.write("
    ".getBytes());
            while((len = fis.read(bytes))!=-1){
                out.write(bytes,0,len);
            }
            fis.close();
            out.close();
            readWb.close();    
            socket.close();
            server.close();
        }
    }
    
    
    访火狐
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
            ServerSocket server = new ServerSocket(8888);
            while(true){
                Socket socket = server.accept();
                new Thread(new Web(socket)).start();
            }
        }
        static class Web implements Runnable{
            private Socket socket;
    
            public Web(Socket socket){
                this.socket=socket;
            }
    
            public void run() {
                try{
                    //转换流,读取浏览器请求第一行
                    BufferedReader readWb = new
                            BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String requst = readWb.readLine();
                    //取出请求资源的路径
                    String[] strArr = requst.split(" ");
                    System.out.println(Arrays.toString(strArr));
                    String path = strArr[1].substring(1);
                    System.out.println(path);
    
                    FileInputStream fis = new FileInputStream(path);
                    System.out.println(fis);
                    byte[] bytes= new byte[1024];
                    int len = 0 ;
                    //向浏览器 回写数据
                    OutputStream out = socket.getOutputStream();
                    out.write("HTTP/1.1 200 OK
    ".getBytes());
                    out.write("Content-Type:text/html
    ".getBytes());
                    out.write("
    ".getBytes());
                    while((len = fis.read(bytes))!=-1){
                        out.write(bytes,0,len);
                    }
                    fis.close();
                    out.close();
                    readWb.close();
                    socket.close();
                }catch(Exception ex){
    
                }
            }
        }
    
    }
  • 相关阅读:
    POJ 1141 括号匹配 DP
    881. Boats to Save People
    870. Advantage Shuffle
    874. Walking Robot Simulation
    文件操作
    861. Score After Flipping Matrix
    860. Lemonade Change
    842. Split Array into Fibonacci Sequence
    765. Couples Holding Hands
    763. Partition Labels
  • 原文地址:https://www.cnblogs.com/alice-bj/p/12427936.html
Copyright © 2020-2023  润新知