先看段打开网页的代码:URL url=new URL("http://souljava.blog.163.com/");

URLConnection connection=url.openConnection();

connection.getInputStream();

问题1:客户端浏览器怎么判断接受到的是什么数据类型?

回答:java的附带浏览器JEditorPane会按以下方式,依次判断

URLConnectiongetContentType()

根据 URL 的指定 "file" 部分尝试确定对象的内容类型。

根据输入流的开始字符尝试确定输入流的类型。

问题2:如果传送的数据类型不在(RFC) 中怎么办?

回答:自定义协议处理框架

贴几个关键的类:

*abstract classURLConnection

表示客户程序与远程服务器的连接。 客户程序可以从URLConnection获得输入输出流

推荐覆盖:

StringgetContentType()从URL 判断返回何种MIME

abstract  voidconnect()解析URL ,由自己实现的超类建立soket连接

getInputStream()从soket连接中,获取输入流

*public abstract classURLStreamHandler

协议处理器,主要负责创建与协议相关的URLConnection对象.

推荐覆盖:

protected abstractopenConnection(URLu)

URLStreamHandler 对象被重载URLStreamHandlerFactory的createURLStreamHandler(Stringprotocol)

*abstract classContentHandler

内容处理器,负责解析服务器发送的数据,然后转换成 合适的java 数据结构

推荐覆盖:

依次遍历classes中的元素如果匹配就返回

ContentHandler 由ContentHandlerFactory 创建

需要覆盖:createContentHandler(Stringmimetype) 判断产生何种ContentHandler

自定义协议处理框架

自定义的echo协议import java.net.*;

import java.io.*;

import echo.*;

public class EchoClient{

public static void main(String args[])throws IOException{

//设置URLStreamHandlerFactory

URL.setURLStreamHandlerFactory(new EchoURLStreamHandlerFactory());

//设置ContentHandlerFactory

URLConnection.setContentHandlerFactory(new EchoContentHandlerFactory());

URL url=new URL("echo://localhost:8000");

EchoURLConnection connection=(EchoURLConnection)url.openConnection();

connection.setDoOutput(true);

PrintWriter pw=new PrintWriter(connection.getOutputStream(),true);

while(true){

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

String msg=br.readLine();

pw.println(msg);  //向服务器发送消息

String echoMsg=(String)connection.getContent(); //读取服务器返回的消息

System.out.println(echoMsg);

if(echoMsg.equals("echo:bye")){

connection.disconnect(); //断开连接

break;

}

}

}

}

package echo;

import java.net.*;

import java.io.*;

public class EchoContentHandler extends ContentHandler{

public Object getContent(URLConnection connection)throws IOException{

InputStream in=connection.getInputStream();

BufferedReader br=new BufferedReader(new InputStreamReader(in));

return br.readLine();

}

public Object getContent(URLConnection connection,Class[] classes)throws IOException{

InputStream in=connection.getInputStream();

for(int i=0;i

if(classes[i]==InputStream.class)

return in;

else if(classes[i]==String.class)

return getContent(connection);

}

return null;

}

}

package echo;

import java.net.*;

public class EchoContentHandlerFactory implements ContentHandlerFactory{

public ContentHandler createContentHandler(String mimetype){

if(mimetype.equals("text/plain")){

return new EchoContentHandler();

}else{

return null;

}

}

}

package echo;

import java.net.*;

import java.io.*;

public class EchoURLConnection extends URLConnection{

private Socket connection=null;

public final static int DEFAULT_PORT=8000;

public EchoURLConnection(URL url){

super(url);

}

public synchronized InputStream getInputStream() throws IOException{

if(!connected)connect();

return connection.getInputStream();

}

public synchronized OutputStream getOutputStream() throws IOException{

if(!connected)connect();

return connection.getOutputStream();

}

public String getContentType(){

return "text/plain";

}

public synchronized void connect()throws IOException{

if(!connected){

int port=url.getPort();

if(port<0 || port>65535)port=DEFAULT_PORT;

this.connection=new Socket(url.getHost(),port);

this.connected=true;

}

}

public synchronized void disconnect() throws IOException{

if(connected){

this.connection.close();

this.connected=false;

}

}

}

package echo;

import java.net.*;

import java.io.*;

public class EchoURLStreamHandlerFactory implements URLStreamHandlerFactory{

public URLStreamHandler createURLStreamHandler(String protocol){

if(protocol.equals("echo"))

return new EchoURLStreamHandler();

else

return null;

}

}

java 协议处理器_协议处理器urlstreamhandler及contenthandler相关推荐

  1. java的网络协议学习_协议简史:如何学习网络协议?

    大学时,学到网络协议的7层模型时,老师教了大家一个顺口溜:物数网传会表应.并说这是重点,年年必考,5分的题目摆在这里,你们爱背不背. 考试的时候,果然遇到这个问题,搜索枯肠,只能想到这7个字的第一个字 ...

  2. 多核处理器_手机处理器性能排行:骁龙865第四,麒麟9000拿下第二

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 注:本文转载自网络,不代表 ...

  3. 多核处理器_多核处理器还能走多远?2050年用上1024核CPU

    随着锐龙Threadripper 3990X处理器的上市,AMD在桌面处理器上也带来了64核128线程处理器了,这是目前最强大的桌面CPU,甚至短时间内都没可能有竞品超过它了. 想想两三年前,市面上的 ...

  4. vm虚拟机分配处理器_虚拟机处理器核数与物理cpu的关系

    vCPU,顾名思义,是虚拟CPU. 创建虚拟机时,需求配置vCPU资源. 因而vCPU是虚拟机的部件. 因而脱离VM,议论vCPU是没有意义的. 虚拟化办理体系怎么调度vCPU,取决于体系内的虚拟机数 ...

  5. 联发科有没有高端处理器_联发科处理器哪些好 2019联发科处理器排名

    导语:联发科处理器在智能数码上是经常能听见的,而其处理器在不断的革新中也有着很强劲的性能,那么联发科处理器到底哪些品质是比较不错的呢?下面排行榜123网就整理了2019联发科处理器排名给您作为参考! ...

  6. 联发科有没有高端处理器_联发科处理器怎么样?真的很差吗?

    其实让学姐很佩服的是,联发科的处理器工程师是很努力专研的,但是当年的小米手机把联发科的最好的旗舰处理器用在了小米低端机上,这让大家对联发科的印象不太好,感觉是在做低端产品!不过魅族当年和小米不同,魅族 ...

  7. 多核处理器_手机处理器性能排行:骁龙865第四,麒麟9000第二,第一优势明显!...

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到最新文章了.每天都有分享.完全是免费订阅,请放心关注.感谢大家的阅读,喜欢小编 ...

  8. 四核处理器_电脑处理器后面的字母你认识几个?不认识跟我来学学(intel篇)...

    在买电脑的时候,不管是买台式机还是笔记本,挑到处理器的时候总会发现处理器后面带个大写字母,像G.H.U等,当然,对于intel和AMD来说,自家的命名规则不同,所用字母也就不同,接下来给大家盘一下. ...

  9. 各路由协议的协议号_协议号和端口号大全

    协议号和端口号大全 协议号和端口号大全协议号是存在于 IP 数据报的首部的 20 字节 的固定部分,占有 8bit. 该字段是指出此数据报所携带的是数据是使 用何种协议,以便目的主机的 IP 层知道将 ...

最新文章

  1. 描述关系型数据库中的三种关系
  2. DokuWiki 开源wiki引擎程序
  3. 2-结构体的最后一个成员的定义-C语言中的柔性数组-
  4. HDU 1213 How Many Tables【并查集】
  5. 那些用Go实现的分布式事务框架
  6. YIi 设置 ajax 验证
  7. 【量产】波士顿动力机器狗,当警犬不错,上战场。。。
  8. 高性能网关设备及服务实践
  9. PAT 乙级 1017. A除以B (20) Java版
  10. 【转】暴露问题是对项目验收最起码的尊重!
  11. 更新的ccna实训交换机基本配置(附图)
  12. 【BZOJ3097】 Hash Killer I
  13. 不二越机器人编程手册_NACHI机器人说明书
  14. 操作系统之Auditing Subsystem—Linux OS
  15. 情感分析textblob--英文分析
  16. 【渝粤教育】国家开放大学2019年春季 0553-22T色彩 参考试题
  17. 微信小程序纯前端生成海报并保存本地
  18. mac服务器文件夹权限设置密码,如何在Mac os优胜美地给文件和文件夹加密
  19. BUPT-CSAPP 2019 Fall 3.58 3.60 3.63
  20. 自上而下解读ncnn系列(1):加载param模型和bin文件前向传播

热门文章

  1. Android Studio 选项菜单和动画结合_Android 应用与iOS 应用之间的设计差异对比!
  2. pytorch 语义分割loss_vedaseg:基于pytorch的开源语义分割工具库,更多模型支持,更易拓展...
  3. Jquery基础知识
  4. python中的异步与同步
  5. Kafka高性能相关
  6. Redis系列教程(七):Redis并发竞争key的解决方案详解
  7. 知识工场 | CN-DBpedia 漫游指南
  8. 【论文翻译】HeteSim:异构网络中相关性度量的通用框架
  9. lambda函数+map函数的结合使用 list(map(lambda x: list(x)[0], X))
  10. 关于”算法工程师/机器学习工程师”的笔试和面试总结