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有深一点的理解了。
浙公网安备 33010602011771号