• java学习day19--API-Socket(网络编程)入门


    Socket(网络编程)

    Socket概述

    也叫套接字编程,是一个抽象层。应用程序可以通过它发送或接收数据,可对其像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口与协议的组合。

    • Socket就是为网络编程提供的一种机制 (通信的两端都有Socket)
    • 网络通信其实就是Socket间的通信 (数据在两个Socket间通过IO传输)

    图解

    图解

    ServerSocket类 (服务端)

    ServerSocket

    作用:接收客户端发来的信息,以及向客户端做出响应.

    在服务器端,选择一个端口号,在指定端口上等待客户端发起连接。

    启动服务:ServerSocket ss = new ServerSocket(端口);

    等待客户端发起连接,并建立连接通道:Sokcet socket = ss.accept();

    Socket类 (客户端)

    Socket

    作用:接收服务器发来的信息,以及不断想服务器发送请求信息.

    新建Socket对象,连接指定ip的服务器的指定端口

    Socket s = new Socket(ip, port);
    

    从Socket获取双向的流. 这里可联合IO流一起使用

    InputStream in = s.getInputStream(); // 获取读取流 (接收流)
    OutputStream out = s.getOutputStream(); // 获取写出流 (发送流)
    

    实例入门

    案例介绍:

    ​ 客户端发送hello, 服务器响应world

    Server类

    // 这个类用来测试 网络通信服务器端
    // 服务器: 负责接收客户端发来的请求 并作出回应
    public class Server {
        public static void main(String[] args) throws IOException {
            // 启动服务器 -- 是指在8000端口号的位置, 等待客户端连接
            // 端口号包含: 0 ~ 65535, 其中 0 ~ 1024 已被系统占用
            ServerSocket server = new ServerSocket(8000);
            System.out.println("服务器已启动, 等待客户端连接");
            // 接口客户端发来的请求 -- 并建立数据连接通道
            Socket socket = server.accept(); // 进入阻塞状态, 等待客户端连接
            System.out.println("与客户端连接成功");
            // 从客户端获取内容
            InputStream in = socket.getInputStream();
            for (int i = 0; i < 5; i++) {
                char b = (char) in.read();
                System.out.print(b);
            }
            // 返回给客户端的内容
            OutputStream out = socket.getOutputStream();
            out.write("world".getBytes()); // 回复给客户端的内容
            out.flush();
            in.close();
            out.close();
            socket.close();
        }
    }
    

    Client类

    // 这个类用来测试客户端
    // 客户端: 负责接收服务器发回来的数据, 并给服务器发送数据
    public class Client {
        public static void main(String[] args) throws IOException {
            // 尝试连接服务器 -- 同时制定服务器的ip和端口号
            Socket socket = new Socket("localhost", 8000);
            // 给服务器发送数据, 发送是out, 就是输出流
            OutputStream out = socket.getOutputStream();
            // 写出hello
            out.write("hello".getBytes()); // 发送大到服务器的内容
            out.flush(); // 刷出去, 没有这一句的话服务器无法收到
    
            // 从服务器获取内容
            InputStream in = socket.getInputStream();
            for (int i = 0; i < 5; i++) {
                int b = in.read();
                System.out.print((char) b);
            }
        }
    }
    

    如果需要按行读取, inout可以这样进行定义

    BufferedReader in = new BufferedReader( // 按行读取
        new InputStreamReader( // 转换流
            socket.getInputStream() // 从获取读取流
        )
    );
    PrintWriter out = new PrintWriter( // 按行发送
        new OutputStreamWriter( // 转换流
            socket.getOutputStream() // 获取写出流
        )
    );
    
  • 相关阅读:
    python3 get/post/使用代理/自定义header/自定义Cookie
    网页定位点击事件js响应函数教程(Chrome)
    burpsuite只拦截特定网站数据包教程
    AWVS和AppScan使用代理进行扫描教程
    kdbg安装使用教程(kali)
    kali-rolling安装nessus 7并创建扫描任务教程
    WebGoat 8安装、配置、使用教程(CentOS)
    应用层协议与传输层、网络层、数据链路层在编码上的区别
    Oracle Linux下载教程(以Oracle Linux 6.9为例)
    su和su -的区别
  • 原文地址:https://www.cnblogs.com/liqbk/p/12968441.html
Copyright © 2020-2023  润新知