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

    网络编程

    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() // 获取写出流
        )
    );
    
  • 相关阅读:
    Pigeon源码分析(一)-- 服务注册
    使用postman配置header的惨痛经历
    Redis字典知识点总结
    SpringBoot和Mybatis结合原理
    Mycat误区解释
    Mycat之常用分片规则
    Mycat之ER表划分
    模拟死锁
    生产者消费者阻塞队列
    堆排序TopK
  • 原文地址:https://www.cnblogs.com/zpKang/p/12970411.html
Copyright © 2011-2022 走看看