网络编程

网络编程

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() // 获取写出流
    )
);
posted @ 2020-05-27 09:14  zpk-aaron  阅读(163)  评论(0编辑  收藏  举报