一、BIO网络编程实战之编写BioServer服务端
BioServer
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class BioServer { private static final int PORT = 8080; public static void main(String[] args)throws IOException { ServerSocket server = null; try { server = new ServerSocket(PORT); System.out.println("the time server is start in port :"+PORT); Socket socket = null; while (true){ socket = server.accept(); new Thread(new TimeServerHandler(socket)).start(); } }catch (Exception e){ e.printStackTrace(); }finally { if(server != null){ System.out.println("the time server close"); server.close(); } } } }
TimeServerHandler
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Date; public class TimeServerHandler implements Runnable{ private Socket socket; public TimeServerHandler(Socket socket){ this.socket = socket; } @Override public void run() { BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader( new InputStreamReader(this.socket.getInputStream())); out = new PrintWriter(this.socket.getOutputStream(),true); String body = null; while (( body = in.readLine())!= null && body.length()!=0){ System.out.println("the time server receive msg :"+body); out.println(new Date().toString()); } } catch (Exception e){ e.printStackTrace(); } finally { if(in != null){ try { in.close(); }catch (Exception e){ e.printStackTrace(); } } if(out != null){ try { out.close(); }catch (Exception e){ e.printStackTrace(); } } if(this.socket != null){ try{ this.socket.close(); }catch (Exception e){ e.printStackTrace(); } } } } }
安装telnet
下面的代码仅针对win下的操作,其他系统自行网上搜索哈[aru_31]
Dism /Online /Enable-Feature /FeatureName:TelnetClient
输入下面代码即可建立连接,效果如下图
telnet localhost 8080
二、BIO网络编程实战之编写BioClient客服端
package com.example.test05.demo.bio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class BioClient { private static final int PORT = 8080; private static final String HOST = "127.0.0.1"; public static void main(String[] args)throws IOException { Socket socket = null; BufferedReader in = null; PrintWriter out = null; try { socket = new Socket(HOST, PORT); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); out.println("i am client"); String resp = in.readLine(); System.out.println("当前服务器时间是:"+resp); }catch (Exception e){ e.printStackTrace(); }finally { if (in != null) { try { in.close(); } catch (Exception e) { e.printStackTrace(); } } if (out != null) { try { out.close(); } catch (Exception e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (Exception e) { e.printStackTrace(); } } } } }
三、BIO编写Client/Server通信优缺点分析
- 优点:
- 模型简单
- 编码简单
- 缺点
- 性能瓶颈,请求数和线程数 N:N关系
- 高并发情况下,CPU切换线程上下文损耗大
本文作者为DBC,转载请注明。