java协议
注册协议
URL的static URLStreamHandler getURLStreamHandler(String protocol) 方法用于获取获取协议处理类
URL提供了两种注册协议的途径。
1)设置URLStreamHandlerFactory,2)设置jvm启动参数java.protocol.handler.pkgs。
两者可以同时使用。
设置URLStreamHandlerFactory
URL的方法
public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) {
synchronized (streamHandlerLock) {
if (factory != null) {
throw new Error("factory already defined");
}
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkSetFactory();
}
handlers.clear();
factory = fac;
}
}
public interface URLStreamHandlerFactory {
URLStreamHandler createURLStreamHandler(String protocol);
}
整个jvm只能设置一次,再次设置不起作用。调用URL.setURLStreamHandlerFactory(fac)。
一般是在服务器的代码中设置,比如tomcat,jboss ,was等,用于注册服务器自己的协议,应用级没法设置,因为服务器已经设置过了,应用即使设置了也不起作用。
启动参数-Djava.protocol.handler.pkgs
通过-Djava.protocol.handler.pkgs=cn.ccb.wfcp注册自定义协议的包。要求协议处理类的类名必须是Handler,包名的最后是协议名。示例如下,定义了brules协议。
package cn.ccb.wfcp.brules;
public class Handler extends URLStreamHandler {
如果要定义多个协议包就用"|"分割,比如-Djava.protocol.handler.pkgs=cn.ccb.wfcp|cn.ccb.wfcp22.
jvm内置的协议也是按照上面的方式定义的,但不用通过-Djava.protocol.handler.pkgs注册,而是将内置的协议包拼接到后面。内置协议都在sun.net.www.protocol包下面。
获取到Handler类名后去加载class。Class cls = null;
try {
cls = Class.forName(clsName);
} catch (ClassNotFoundException e) {
ClassLoader cl = ClassLoader.getSystemClassLoader();
if (cl != null) {
cls = cl.loadClass(clsName);
}
}
if (cls != null) {
handler =
(URLStreamHandler)cls.newInstance();
}
B. java现在是什么使用协议
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一。如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的。本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序。
方法/步骤
Java中的socket编程 下面的部分将通过一些示例讲解一下如何使用socket编写客户端和服务器端的程序。 注意:在接下来的示例中,我将使用基于TCP/IP协议的socket编程,因为这个协议远远比UDP/IP使用的要广泛。并且所有的socket相关的类都位于java.net包下,所以在我们进行socket编程时需要引入这个包。
写入数据 接下来就是写入请求数据,我们从客户端的socket对象中得到OutputStream对象,然后写入数据后。很类似文件IO的处理代码。
打开服务器端的socket
读取数据 通过上面得到的socket对象获取InputStream对象,然后安装文件IO一样读取数据即可。这里我们将内容打印出来。
使用socket实现一个回声服务器,就是服务器会将客户端发送过来的数据传回给客户端。
C. 怎么用java实现ssh协议通信
importch.ethz.ssh2.Connection;
importch.ethz.ssh2.Session;
importch.ethz.ssh2.StreamGobbler;
importcom.io.Debug;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
/**
*
*@authorleon.lee
*/
{
privateStringusername="";
privateStringoldpassword="";
privateConnectionconn=;
privatebooleanhasError=false;
privateStringErrorMessage="";
privatebooleanisSuccessfully=false;
privateStringSystemMessage="";
publicstaticfinalStringHOST="127.0.0.1";//serverip
publicbooleanisSuccessfully(){
returnisSuccessfully;
}
publicbooleanisHasError(){
returnhasError;
}
publicStringgetErrorMessage(){
returnErrorMessage;
}
publicvoidsetErrorMessage(Stringmsg){
hasError=true;
this.ErrorMessage=msg;
}
/**
*Createsanewinstanceof<code>ChangeEmailPassword</code>.
*@paramusername
*@paramoldpassword
*/
publicChangeEmailPassword(Stringusername,Stringoldpassword){
this.username=username;
this.oldpassword=oldpassword;
try{
conn=newConnection(HOST);
conn.connect();
/*Authenticate*/
booleanisAuthenticated=conn.authenticateWithPassword(username,oldpassword);
if(isAuthenticated==false){
setErrorMessage("Authenticationfailed.");
conn=;
}
}catch(Exceptione){
conn.close();
conn=;
System.out.println(e);
}
}
publicvoidsetNewPassword(Stringnewpassword){
if(hasError){
return;
}
if(conn==){
return;
}
try{
Sessionsess=conn.openSession();
sess.execCommand("passwd");
InputStreamso=sess.getStdout();
InputStreamerr=sess.getStderr();
OutputStreamout=sess.getStdin();
byte[]buffer=newbyte[500];//其实没有必要这么大.130就差不多了.怕万一有什么提示.
intlength=0;
length=err.read(buffer);
//if(length>0){
//System.out.println("#1:"+newString(buffer,0,length));
////(current)UNIXpassword:
//}
Stringcoldpassword=oldpassword+" ";
out.write(coldpassword.getBytes());
length=err.read(buffer);
//if(length>0){
//System.out.println("#2:"+newString(buffer,0,length));
////(current)UNIXpassword:
//}
Stringcnewpass=newpassword+" ";
out.write(cnewpass.getBytes());
length=err.read(buffer);
if(length>0){
Stringrs=newString(buffer,0,length);
//System.out.println("#3:"+rs);
if(rs.indexOf("BAD")>-1){
sess.close();
conn.close();
setErrorMessage(rs);
return;
}
}
out.write(cnewpass.getBytes());
length=so.read(buffer);
if(length>0){
Stringrs=newString(buffer,0,length);
if(rs.indexOf("successfully")>-1){
this.isSuccessfully=true;
this.SystemMessage=rs;
}
}
/*Closethissession*/
sess.close();
/*Closetheconnection*/
conn.close();
}catch(IOExceptione){
e.printStackTrace(System.err);
}
}
/**
*@
*/
publicstaticvoidmain(String[]args){
ChangeEmailPasswordcep=newChangeEmailPassword("username","oldpassword");
if(cep.isHasError()){
System.out.println(cep.getErrorMessage());
cep=;
return;
}
cep.setNewPassword("newpassword");
if(cep.isHasError()){
System.out.println(cep.getErrorMessage());
cep=;
return;
}
if(cep.isSuccessfully){
System.out.println(cep.getSystemMessage());
}
}
/**
*@returntheSystemMessage
*/
publicStringgetSystemMessage(){
returnSystemMessage;
}
}
D. java如何获取本机网络协议信息
api上面我翻了下似乎没有,但是你可以使用java调用本地的shell进行查看(windows和linux的命令不太一样,但方法一样)。
代码:
Process process= Runtime.getRuntime().exec("你本地的shell或者cmd命令");
InputStream s=process.getInputStream();
//从is里面读取内容(也就是你的命令执行结果),这里代码就省略了
process.waitFor();
至于具体命令的话用下 netstat -s 看下
E. JAVA语言支持哪些协议 各协议对JAVA具体的用途
协议最主要用于通信,通信双方必须遵守协议才能进行正常通信。
可以用生活中的寄信来类比。寄信方必须写明收信方的地址及收信人姓名,并且把信件放到信封中贴上邮票投递到邮箱中,收信人才能收到此信件。收信方必须到邮箱中才能收取信件。这种对通信双方的约束规则,便是协议!
例如Http协议,它规定了浏览器应该以什么样的格式且怎样发送请求和接受响应,同时也规定了服务器应该怎么样解析浏览器发来的请求并且作出响应。在Http协议的约束下,不同的浏览器才能和不同的服务器实现正常通信!
F. java程序里面指定协议ssl和tsl的区别
最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。
1.TLS与SSL的差异
1)版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。
2)报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用了RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是连接运算,而HMAC算法采用的是异或运算。但是两者的安全程度是相同的。
3)伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。
4)报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。
5)密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。
6)certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。
7)加密计算:TLS与SSLv3.0在计算主密值(master secret)时采用的方式不同。
8)填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度要达到密文块长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击。
2.TLS的主要增强内容
TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS 在SSL v3.0 的基础上,提供了以下增强内容:
1)更安全的MAC算法;
2)更严密的警报;
3)“灰色区域”规范的更明确的定义;
3.TLS对于安全性的改进
1)对于消息认证使用密钥散列法:TLS 使用“消息认证代码的密钥散列法”(HMAC),当记录在开放的网络(如因特网)上传送时,该代码确保记录不会被变更。SSLv3.0还提供键控消息认证,但HMAC比SSLv3.0使用的(消息认证代码)MAC 功能更安全。
2)增强的伪随机功能(PRF):PRF生成密钥数据。在TLS中,HMAC定义PRF。PRF使用两种散列算法保证其安全性。如果任一算法暴露了,只要第二种算法未暴露,则数据仍然是安全的。
3)改进的已完成消息验证:TLS和SSLv3.0都对两个端点提供已完成的消息,该消息认证交换的消息没有被变更。然而,TLS将此已完成消息基于PRF和HMAC值之上,这也比SSLv3.0更安全。
4)一致证书处理:与SSLv3.0不同,TLS试图指定必须在TLS之间实现交换的证书类型。
5)特定警报消息:TLS提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS还对何时应该发送某些警报进行记录。
G. 怎样才能通过TCP传输协议用Java实现文件的
服务端监听:ServerSocket server=new ServerSocket(port);//port:绑定的端口号
Socket client=server.accept();//监听端口,一旦取得连接则获得客户端的socket连接对象client
客户端: Socket s=new Socket(ip,port);//要连接的服务器的ip以及端口号
如果正常连接上之后,socket的对象可以获得InputStream和OutputStreame,然后就可以进行通信了
完成通信之后,执行socket对象的close()方法关闭连接,完成一次完整的socket连接
H. java相关网络协议占用内存。
那东西的增加大来部分消耗在缓自存上,随着程序的运行各种缓存机制什么的都会把一些东西放在内存中,但是这些资源因为是tomcat中的项目缓存的,所以也不会释放,目前最快的方法就是一键加速了,双击下360的那个加速球就行了。另外就是优化代码,垃圾回收了。尽量少用全局变量,不用的变量能释放就释放,对象能销毁就销毁。
I. 如何实现java解析网络协议报文
普通参数:
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
文件参数:
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
参数实体的最后一行是: --加上boundary加上--,最后换行,这里的 格式即为: --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--。
模拟文件上传请求
public static void uploadFile(String fileName) {
try {
// 换行符
final String newLine = "\r\n";
final String boundaryPrefix = "--";
// 定义数据分隔线
String BOUNDARY = "========7d4a6d158c9";
// 服务器的域名
URL url = new URL("www.myhost.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置为POST情
conn.setRequestMethod("POST");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求头参数
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
OutputStream out = new DataOutputStream(conn.getOutputStream());
// 上传文件
File file = new File(fileName);
StringBuilder sb = new StringBuilder();
sb.append(boundaryPrefix);
sb.append(BOUNDARY);
sb.append(newLine);
// 文件参数,photo参数名可以随意修改
sb.append("Content-Disposition: form-data;name=\"photo\";filename=\"" + fileName
+ "\"" + newLine);
sb.append("Content-Type:application/octet-stream");
// 参数头设置完以后需要两个换行,然后才是参数内容
sb.append(newLine);
sb.append(newLine);
// 将参数头的数据写入到输出流中
out.write(sb.toString().getBytes());
// 数据输入流,用于读取文件数据
DataInputStream in = new DataInputStream(new FileInputStream(
file));
byte[] bufferOut = new byte[1024];
int bytes = 0;
// 每次读1KB数据,并且将文件数据写入到输出流中
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
// 最后添加换行
out.write(newLine.getBytes());
in.close();
// 定义最后数据分隔线,即--加上BOUNDARY再加上--。
byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine)
.getBytes();
// 写上结尾标识
out.write(end_data);
out.flush();
out.close();
// 定义BufferedReader输入流来读取URL的响应
// BufferedReader reader = new BufferedReader(new InputStreamReader(
// conn.getInputStream()));
// String line = null;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
} catch (Exception e) {
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
}
}
J. java.sql.SQLException: 违反协议
违反协议错误,一般都是JDBC的驱动出错了,你检查一下连接数据库的JDBC驱动是否正确。
Oracle 11G的JDBC驱动并不能用于Oracle 10G Release 2的数据库,因此必须使用Oracle 10G Release2的JDBC驱动,这个驱动可以在Oracle安装目录下找到。在Oracle安装目录下找一个JDBC的目录,其下有一个LIB目录,拷贝其中ojdbc14.jar文件就可以了。