开发者学堂课程【 Java 高级编程:BIO 处理模型】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/20/detail/430
BIO处理模型
简介:现在尽管已经实现了一个标准的网络程序开发,但是在整个的开发过程之中本程序存在有严重的性能缺陷,因为该服务器只能够为一个线程提供 Echo 服务。
如果说现在的服务器需要有多人进行连接访问的时候那么其它的使用者将无法连接(等待连接)。
所以现在就可以发现单线程的服务器开发本身就是一种不合理的做法,那么此时最好的解决方案将每一个连接到服务器上的客户端都通过一个线程对象来进行处理,即:服务器上启动多个线程,每一个线程单独为每一个客户端实现 Echo 服务支持。
Echo多线程模型(BIO)
范例:修改服务器端程序
package cn.mldn.demo.server;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class EchoServer {
private class ClientThread implements Runnable {
private Socket client = null ;// 描述每-一个不同的客户端
private Scanner scan = nu11 ;
private PrintStream out = null ;
public ClientThread(Socket client) throws Exception {
this.client = client ;
this.scan = new Scanner(client. getInputStream()) ; // 客户端输入流this. scan.useDelimiter("\n") ; //设置分隔符
this.out = new PrintStream(client . getOutputStream()) ; //客户端输出流
@Override
public void run() {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(9999);//设置服务器端的监听端口System . out. println("等待客户端连接............");
Socket client = server .accept() ; // 有客户端连接
//首先需要先接收客户端发送来的信息,而后才可以将信息处理之后发送回客户端
boolean flag = true ; // 循环标记
/
/首先需要先接收客户端发送来的信息,而后才可以将信息处理之后发送回客户端boolean flag = true ; //循环标记
boolean flag = true ; //循环标记
while (flag) {
if(scan. hasNext()) { // 现在有数据发送
String val = scan.next(). trim() ; // 接收发送的数据if ("byebye". equalsIgnoreCase(val)) {
out.print1n("ByeByeBye....");
flag = false ; //结束循环
}
else {
out.print1n(" [ECHO]" + val);
public static void main(String[] args) throws Exception f
ServerSocket server = new ServerSocket(9999) ;
//设置服务器端的监听端口
out.print1n("等待客
户
端
连
接............");
//首先需要先接收客 户端发送来的信息,而后才可以将信息处理之后发送回客户端
boolean flag = true ;
//循环标记
while (flag)
{
Socket client = server .accept() ;
//有客户端连接
if( scan. hasNext())
//现在有数据发送
String val = scan.next().trim() ;
//接收发送数据
if ("byebye" equalsIgnoreCase(val))
{
out. println("ByeByeBye. . .");
flag = false ; // 结束循环
else f
out println(" ЕCHO + val);
scan.close();
out.close();
client.close();
server .close( );
</div>