zoukankan      html  css  js  c++  java
  • 网络编程

    一、网络编程入门

    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){
    
                }
            }
        }
    
    }
  • 相关阅读:
    str_split 分隔中文出现乱码 替代函数
    PHP 浮点数 转化 整数方法对比 ceil,floor,round,intval,number_format
    php 判断字符串之间包含关系
    不解之谜
    正则匹配 特殊的 符号
    PHP 判断字符串 是否 包含另一个字符串
    PHP 删除 数组 指定成员
    HTML 权重标签的使用
    【PAT甲级】1094 The Largest Generation (25 分)(DFS)
    【PAT甲级】1093 Count PAT's (25 分)
  • 原文地址:https://www.cnblogs.com/alice-bj/p/12427936.html
Copyright © 2011-2022 走看看