java 协议处理器_协议处理器urlstreamhandler及contenthandler

先看段打开网页的代码: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;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自己做一个小项目python_【Python】第一个微信小项目

一、微信好友数据分析功能介绍1.爬取好友列表,显示好友昵称、性别和地域和签名, 文件保存为 xlsx 格式2.统计好友的地域分布&#xff0c;并且做成词云和可视化展示在地图上3.获取所有好友的头像&#xff0c;合并成一张大图二、需要的库1、Pyecharts&#xff1a;一个用于生成ech…

RISC-V的自定义CPU悖论

来源&#xff1a;内容编译自「eejournal」&#xff0c;谢谢。随着这些年的发展&#xff0c;RISC-V的受重视程度与与日俱增。这主要因为它是免费的、灵活的&#xff0c;并且速度很快。这使RISC-V成为许多开发人员的安全便捷选择。但是您会认为RISC-V是通用RISC处理器还是定制的随…

java计算加速减速_Javascript加速运动与减速运动

加速运动&#xff0c;即一个物体运动时速度越来越快&#xff1b;减速运动&#xff0c;即一个物体运动时速度越来越慢。现在用Javascript来模拟这两个效果&#xff0c;原理就是用setInterval或setTimeout动态改变一个元素与另外一个元素的距离&#xff0c;如xxx.style.left或xxx…

python 运维包_基础入门_Python-模块和包.运维开发中__import__动态导入最佳实践?

常规导入:import module_name[,module1,...]from module_name import [*|child[,child1,...]from module_name import [*|child[,child1,...] as alias_name注意: 导入语句可出现在程序任意位置,自定义包要实现from module_name import *的效果则此模块必须在__init__.py实现__…

华为宣布出售荣耀,声明来了

来源&#xff1a;澎湃新闻综合华为官网、《深圳特区报》今天&#xff0c;华为发表声明&#xff0c;整体出售荣耀业务资产。对于交割后的荣耀&#xff0c;华为不占有任何股份&#xff0c;也不参与经营管理与决策。11月17日一早&#xff0c;荣耀最终的出售方案公布。多家企业在《…

Node.js教程-mysql模块

概述 在Node.js中&#xff0c;mysql模块是实现MySQL协议的JavaScript客户端工具。Node.js程序通过与MySQL建立链接&#xff0c;然后可对数据进行增、删、改、查等操作。 安装 由于mysql模块不是Node.js内置模块&#xff0c;需手动安装 npm i mysql注意&#xff1a;若MySQL服…

java 几种引用类型_Java 四种引用类型总结-Fun言

1. Java引用介绍Java从1.2版本开始引入了4种引用&#xff0c;这4种引用的级别由高到低依次为&#xff1a;强引用 > 软引用 > 弱引用 > 虚引用⑴ 强引用(Strong Reference)强引用是使用最普遍的引用&#xff0c;也是赋值的默认引用。如果一个对象具有强引用&…

JS运算符类型

一、运算符类型 1、算术运算符&#xff1a;用于各类数值运算&#xff0c;包括加()、减(-)、乘(*)、除(/)、求余(或称模运算&#xff0c;%)、自增()、自减(--)共七种。2、关系运算符&#xff1a;用于比较运算。包括大于&#xff08;>&#xff09;、小于&#xff08;<&…

python关于字符串的内置函数_Python 字符串内置函数(二)

# 2.格式化相关# ljust(width) 函数 获取固定长度&#xff0c;左对齐&#xff0c;右边不够用空格补齐# rjust(width) 函数 获取固定长度&#xff0c;右对齐&#xff0c;左边不够用空格补齐# center(width) 函数 获取固定长度&#xff0c;中间对齐&#xff0c;两边不够用空格补齐…

边缘计算4.0正急速驶来,你做好准备了吗?

物联网智库 整理发布导 读近十年间&#xff0c;各行各业的企业都经历着数字化技术和产品对传统生产经营模式的冲击。人工智能、大数据、区块链、自动化等技术的日渐完善&#xff0c;让企业的生产效率和业务模式发生了翻天覆地的变化。

java中for的常规用法_Java for循环的几种用法详解

本文非常适合初学Java的程序员&#xff0c;主要是来了解一下Java中的几种for循环用法&#xff0c;分析得十分详细&#xff0c;一起来看看。J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环&#xff0c;可以用更简单地方式来遍历数组和Collection等类型的对象。本文介…

运维-替换-修改kibana徽标

作为一名纯运维人员&#xff0c;想更改kibana的徽标。 并不能像开发一样去看源码并修改源码。 所以我们可以替换徽标。 先来一个效果图。我的版本是5.5.1。 具体的修改过程&#xff1a; 在kibana安装路径下面。 optimize/bundles/ 0cebf3d61338c454670b1c5bdf5d6d8d.svg 这…

python中的变量的作用_Python中的变量作用域

python中变量作用域包括&#xff1a;L (Local) 局部作用域&#xff0c;函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中&#xff0c;def或者lambda的本地作用域G (Global) 全局作用域&#xff0c;函数中使用global声明的变量或在模块层声明的变量B (Built…

欧拉公式——真正的宇宙第一公式

来源&#xff1a;数学中国欧拉公式是数学里最令人着迷的公式之一&#xff0c;它将数学里最重要的几个常数联系到了一起&#xff1a;两个超越数&#xff1a;自然对数的底e&#xff0c;圆周率π&#xff1b;两个单位&#xff1a;虚数单位i和自然数的单位1&#xff0c;以及数学里常…

SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

我们这一一篇博客讲的是如何整合Springboot和Mybatis框架&#xff0c;然后使用generator自动生成mapper&#xff0c;pojo等文件。然后再使用阿里巴巴提供的开源连接池druid&#xff0c;这个连接池的好处我就不说了&#xff0c;集合了所有连接池的好处&#xff0c;并且还提供了监…

python提取部分字符串三参数_python3 字符串属性(三)

maketrans 和 translate的用法(配合使用)下面是python的英文用法解释maketrans(x, yNone, zNone, /)Return a translation table usable for str.translate().If there is only one argument, it must be a dictionary mapping Unicodeordinals (integers) or characters to Un…

java实现qq抢红包_Java实现抢红包功用

用多线程模仿多人一起抢红包。服务端将玩家发出的红包保存在一个行列里&#xff0c;然后用Job守时将红包信息推送给玩家。每一批玩家的抢红包恳求&#xff0c;其实操作的都是从行列中弹出的第一个红包元素&#xff0c;但当时的红包数量为空的时分&#xff0c;主动弹出下一个红包…

芯片里面100多亿个晶体管是如何安装上去的?

来源&#xff1a;金属加工如今随着芯片制程的不断提升&#xff0c;芯片中可以有100多亿个晶体管&#xff0c;如此之多的晶体管&#xff0c;究竟是如何安上去的呢&#xff1f;1当芯片被不停地放大&#xff0c;里面宛如一座巨大的城市。这是一个Top-down View 的SEM照片&#xff…

[CEOI2008] order

题目描述 有N个工作&#xff0c;M种机器&#xff0c;每种机器你可以租或者买过来. 每个工作包括若干道工序&#xff0c;每道工序需要某种机器来完成,你可以通过购买或租用机器来完成。 现在给出这些参数&#xff0c;求最大利润 输入输出格式 输入格式&#xff1a; 第一行给出 N…

response.end后抛了异常_(七)异常处理

(七)异常处理异常异常的体系结构java.lang.Throwable|-----java.lang.Error&#xff1a;一般不便携针对性的代码进行处理|-----java.lang.Exception&#xff1a;可以进行异常的处理|-----编译时异常&#xff08;checked|-----IOException|-----FileNotFoundException|-----Clas…