telnet的介绍可以参看《java网络编程3》中有一段介绍telnet,我们可以理解为,telnet命令是通过socket协议与服务器端通信。Dubbo提供了telnet命令去查看服务功能。

这里主要介绍一下dubbo实现telnet命令的整体实现:

} else if (message instanceof String) {
if (isClientSide(channel)) {
Exception e = new Exception("Dubbo client can not supported string message: " + message + " in channel: " + channel + ", url: " + channel.getUrl());
logger.error(e.getMessage(), e);
} else {
String echo = handler.telnet(channel, (String) message);
if (echo != null && echo.length() > 0) {
channel.send(echo);
}
}
}

当服务器端接收到的消息类型是string的时候回调用到TelnetHandler的telent方法中。

TelnetHanlderAdpter类会从接收的字符串解析出命令,根据dubbo的spi扩展机制获取对应的TelnetHandler实现。

这里我们查看DubboProtocol类中 private ExchangeHandler requestHandler = new ExchangeHandlerAdapter()  的实现,会发现:

/**
* ExchangeHandlerAdapter
*/
public abstract class ExchangeHandlerAdapter extends TelnetHandlerAdapter implements ExchangeHandler { public Object reply(ExchangeChannel channel, Object msg) throws RemotingException {
return null;
} }

而TelnetHandlerAdapter类的内容为:

public class TelnetHandlerAdapter extends ChannelHandlerAdapter implements TelnetHandler {

    private final ExtensionLoader<TelnetHandler> extensionLoader = ExtensionLoader.getExtensionLoader(TelnetHandler.class);

    public String telnet(Channel channel, String message) throws RemotingException {
String prompt = channel.getUrl().getParameterAndDecoded(Constants.PROMPT_KEY, Constants.DEFAULT_PROMPT);
boolean noprompt = message.contains("--no-prompt");
message = message.replace("--no-prompt", "");
StringBuilder buf = new StringBuilder();
message = message.trim();
String command;
if (message.length() > 0) {
int i = message.indexOf(' ');
if (i > 0) {
command = message.substring(0, i).trim();
message = message.substring(i + 1).trim();
} else {
command = message;
message = "";
}
} else {
command = "";
}
if (command.length() > 0) {
if (extensionLoader.hasExtension(command)) {
try {
String result = extensionLoader.getExtension(command).telnet(channel, message);
if (result == null) {
return null;
}
buf.append(result);
} catch (Throwable t) {
buf.append(t.getMessage());
}
} else {
buf.append("Unsupported command: ");
buf.append(command);
}
}
if (buf.length() > 0) {
buf.append("\r\n");
}
if (prompt != null && prompt.length() > 0 && !noprompt) {
buf.append(prompt);
}
return buf.toString();
} }

这里我们可以发现  String result = extensionLoader.getExtension(command).telnet(channel, message); , 这个我们可以理解为,你在telnet输入的每个命令,都由一个类对象来处理。

在com.alibaba.dubbo.remoting.telnet.TelnetHandler多个文件中有如下配置:

clear=com.alibaba.dubbo.remoting.telnet.support.command.ClearTelnetHandler
exit=com.alibaba.dubbo.remoting.telnet.support.command.ExitTelnetHandler
help=com.alibaba.dubbo.remoting.telnet.support.command.HelpTelnetHandler
……

对于telnent功能的实现方式跟其他的功能类似,由于每个 TelnetHandler实现太细了,这里对有兴趣的读者自己翻看源码。

最新文章

  1. C# volatile关键字
  2. Phpcms V9网站从本地上传到服务器需要修改的地方
  3. 详解YUV与RGB数据格式-2016.01.20
  4. js字符串长度计算(一个汉字==两个字符)和字符串截取
  5. 三个数从小到大排序—南阳acm
  6. LINUX 内核与 systemtap +GO 专家博客 一个[ 系统软件工程师] 的随手涂鸦
  7. Hdu3714-Error Curves(三分)
  8. 关于Ubuntu远程ssh连接失败的问题
  9. adoquery查询语句sql动态查询删除方法
  10. hdu_2955_Robberies(01背包)
  11. 【python学习笔记】2.列表和元组
  12. Microsoft CRM-QueryExpression 成员
  13. activiti节点跳转
  14. zoj 2524 并查集裸
  15. LIBS入门
  16. [福建集训2011][LOJ10111]相框
  17. R语言中的横向数据合并merge及纵向数据合并rbind的使用
  18. Java8新特性值Lambda ---&gt;匿名函数
  19. Kafka(一)-- 初体验
  20. C/C++之Memcpy and memmove

热门文章

  1. csu 1356 Catch bfs(vector)
  2. ADO.NET对象模型之间的关系
  3. python_tensorflow_Django实现逻辑回归
  4. Ubuntu16.04 安装redis
  5. Google APAC----Africa 2010, Qualification Round(Problem B. Reverse Words)----Perl 解法
  6. Python爬虫教程-01-爬虫介绍
  7. Android深入理解Context(三)Context完全解析
  8. android OrmLite
  9. 通过注解实现Spring 声明式事务管理
  10. 【转】c++ http下载文件