Bio实现客户端通信

一、BIO是什么?

BIO:Blocking I/O,同步阻塞I/O模式,数据的读取和写入必须阻塞在一个线程内等待其完成。 模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。

二、服务器客户端通信实现

1.服务方

代码如下(示例):

package com.ccw.api;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * @version 1.0
 * @projectName:com.ccw.api
 * @packageName:test
 * @className:SocketServer
 * @Description:[一句话描述该类的功能]
 * @Author:qhj
 * @CreateDate:2021/4/10 11:34
 * @blog:[方法具体上行/下行参数文档]
 */
public class SocketServer {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try {
            ServerSocket socket = new ServerSocket(10000);
            System.out.println("等待客户端连接...");
            // 同步阻塞,直到建立连接
            Socket client = socket.accept();

            // 发送数据
            new Thread(() -> {
                try {
                    // 有客户端连接了,发送一个消息给客户端
                    OutputStream output = client.getOutputStream();
                    while (true) {
                        String str = scanner.nextLine();
                        output.write(str.getBytes());
                        output.flush();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
            while (true) {
                System.out.println("客户端已连接:" + client.getPort());
                try {
                    InputStream input = client.getInputStream();
                    byte[] bytes = new byte[1024];
                    // 同步阻塞 读取客户端数据 直到输入数据
                    while (input.read(bytes) != -1) {

                        System.out.println("收到客户端消息:" + new String(bytes));
                    }
                } catch (IOException ex) {
                    // 客户端链接断开则引发异常
                    System.err.println("引发异常:" + ex.getMessage());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.客户端

代码如下(示例):

package com.ccw.api;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * @version 1.0
 * @projectName:com.ccw.api
 * @packageName:test
 * @className:SocketClient
 * @Description:[一句话描述该类的功能]
 * @Author:qhj
 * @CreateDate:2021/4/10 11:35
 * @blog:[方法具体上行/下行参数文档]
 */
public class SocketClient {
    public static void main(String[] args) {
        try {
            // 接收控制台用户输入的数据
            Scanner scanner = new Scanner(System.in);
            // 要绑定的主机和端口号
            Socket socketClient = new Socket("127.0.0.1", 10000);

            // 启动线程监听服务端发送的消息
            new Thread(() -> {
                try {
                    InputStream input = socketClient.getInputStream();
                    byte[] bytes = new byte[1024 * 4];
                    while ((input.read(bytes)) != -1) {
                        System.out.println("收到服务端消息:" + new String(bytes));
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();

            OutputStream output = socketClient.getOutputStream();
            while (true) {
                String str = scanner.nextLine();
                if ("exit".equals(str)) {
                    output.close();
                    socketClient.close();
                    break;
                } else {
                    // 向服务端发送消息
                    output.write(str.getBytes());
                    output.flush();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


总结

C/S模型:客户端服务器端模式
服务器端:Serversocket一个服务器域名,bind绑定端口,listen(三次握手)监听队列,accept返回当前链接的客户端信息,send/recv交流信息,close(四次挥手)通道关闭
客户端:socket一个客户端域名,connect(三次握手)建立连接通道,send/recv交流信息,close(四次挥手)关闭通道
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值