JAVA(4)-BIO-NIO
1.BIO BlockingIO的意思。还是从最简单的说起,过程参看前篇,python版,本篇就是用JAVA再写了一遍。
1.1一服务器端,一个客户端
1.2.一个服务器端,多个客户端
2.NIO,非阻塞IO
1.BIO BlockingIO的意思。还是从最简单的说起。
1.1一服务器端,一个客户端
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss= new ServerSocket();
ss.bind(new InetSocketAddress("localhost",8888));
System.out.println("server start");
Socket s=ss.accept();
BufferedReader reader=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=reader.readLine();
System.out.println(str);
System.out.println("server close");
reader.close();
s.close();
ss.close();
}
public class Client {
public static void main(String[] args) throws IOException {
Socket s = new Socket("localhost", 8888);
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write("clientsendMsg");
bw.flush();
bw.close();
}
}
运行的结果:Server 在 接收到client之前一直阻塞在那。
1.2.一个服务器端,多个客户端
添加了while()对每个SOCKET启用一个线程
缺点: 只要有一个有问题,下面的就进不来了。
优点: 如果确定只有十几个客户端,其实这是高效的且简单。
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss= new ServerSocket();
ss.bind(new InetSocketAddress("localhost",8888));
System.out.println("server close");
boolean started=true;
while(started)
{
Socket s = ss.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = reader.readLine();
System.out.println(str);
reader.close();
s.close();
}
ss.close();
}
}
2.NIO,非阻塞IO
2.1非阻塞的都是带 channel的 双向读写
2.2 下面的代码要用,需要加上try/catch..
public class Server
{
public static void main(String[] args)
{
ServerSocketChannel ssc=ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress("127.0.0.1",8888));
ssc.configureBlocking(false);//设置成非阻塞
System.out.println("server started,listening on:"+ssc.getLocalAddress());
//建立了一个大管家selector,管什么呢?管事件 OP_ACCEPT
//建立管道了,
Selector selector=Selector.open();
ssc.register(selector,SelectionKey.OP_ACCEPT);
while(true)
{
selector.select();//轮询看有没有事件 下面处理事件
Set<SelectionKey > keys=selector.selectedkeys();
Iterator<Selectionkey> it=keys.iterator();
while(it.hasNext())
{
SelectionKey key=it.next();
it.remove();
handle(key);
}
}
}
//处理事件的过程
private static void handle(Selectionkey key)
{
if(key.isAcceptable())//事件可以被连上了
{
ServerSocketChannel ssc=(ServerSocketChannel) key.channel();
ServerSocketChannel sc=ssc.accept();//接收,建立新通道
sc.configureBlocking(false);//非阻塞
//监听读事件
sc.register(key.selector(),SelectionKey.OP_READ);
}
else if(key.isReadable())//客户端有数据了
{
SocketChannel sc=null;
sc=(SocketChannel)key.channel();
ByteBuffer buffer=ByteBuffer.allocate(512);
buffer.clear();
int len=sc.read(buffer);
if(len!=-1)
{
System.out.println(new String(buffer.array(),0,len));
}
ByteBuffer bufferToWrite=ByteBuffer.wrap("helloClient".getBytes());
sc.write(bufferToWrite);
if(sc!=null)
{
sc.close();
}
}
}
}

浙公网安备 33010602011771号