BIO实例,实现最基础的单方面远程通信


BIO实例,实现最基础的单方面远程通信

netty学习之路

使用java最基础的原生api,实现远程通信

1、随便创建一个maven项目,不需要任何依赖
2、创建下面这个类
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

/**
 * @Author YuanChangLiang
 * @Date 2021/1/7 16:12
 */
public class testBio {

    /**
     * 通过在cmd中,输入命令telnet 192.168.0.147 6666进行连接
     * 然后快捷键输入ctrl + 】进行输入
     * 命令输入:send hello  ,则这里可以接收到hello
     * @param args null
     * @throws IOException null
     */
    public static void main(String[] args) throws IOException {

        //创建一个线程池
        //如果有客户端连接,就创建一个线程,与之通讯(单独写一个方法)
        ExecutorService executorService = Executors.newCachedThreadPool();
        ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("服务器启动了");
        //监听,等待客户端连接
        final Socket socket = serverSocket.accept();
        System.out.println("连接到一个客户端");
        //创建一个线程与之通信

//        executorService.execute(new Runnable() {
//            @Override
//            public void run() {
//                handler(socket);
//            }
//        });
        //如果不是java8,不会使用lambda表达式,就使用上面这个
        executorService.execute(() -> handler(socket));
    }

    public static void handler(Socket socket)  {
        try {
            System.out.println(Thread.currentThread().getName() + ":");
            byte[] bytes = new byte[1024];
            //通过socket获取输入流
            InputStream inputStream = socket.getInputStream();
            while (true){
                int read = inputStream.read(bytes);
                if(read != -1){
                    System.out.println(new String(bytes,0,read));
                }else {
                    break;
                }
            }
    }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("关闭和client的连接");
            try {
                socket.close();
            }catch (Exception e){
                e.printStackTrace();
            }

        }
    }
}
3、使用方式

1.启动main方法
在这里插入图片描述
2.使用别人电脑,或者直接本地cmd,输入命令:telnet 服务端ip 方法中设置的端口号 示例:

如果是在本地cmd,输入telnet 127.0.0.1 6666即可
如果是在别人电脑,输入telnet 192.168.XX.XX 6666即可

ps:很大可能输入后会提示telnet不是内部命令,只需要百度如何打开telnet命令即可,1分钟都不用就可以打开。

在这里插入图片描述
按回车后,cmd会一片黑色,啥也没有,只需要输入"ctrl"键 和右中括号"] "即可

然后输入命令:send 要输入的字符串
如图:
在这里插入图片描述

我们就会惊喜的发现
在这里插入图片描述
这样就可以远程通信了。

如果是别人的电脑,只需要将127.0.0.1换成程序运行的电脑的ip即可(也就是你自己电脑的ip,亲测也可以)

如果断开连接,也就是把cmd关掉
在这里插入图片描述
因为BIO是阻塞式IO,如果不主动关闭连接,这个线程就会一直保持连接,而且是一个线程就只能连接一个连接,如果有几万个连接,就需要几万个线程,想想就恐怖。

当然,这里对阻塞的提现还不强,但是也能够帮我们对阻塞式io有深一点的理解了。

posted @ 2022-06-14 08:49  道祖且长  阅读(52)  评论(0)    收藏  举报