java自定义协议解析Word文档下载推荐.docx

上传人:b****4 文档编号:6533263 上传时间:2023-05-06 格式:DOCX 页数:10 大小:21.79KB
下载 相关 举报
java自定义协议解析Word文档下载推荐.docx_第1页
第1页 / 共10页
java自定义协议解析Word文档下载推荐.docx_第2页
第2页 / 共10页
java自定义协议解析Word文档下载推荐.docx_第3页
第3页 / 共10页
java自定义协议解析Word文档下载推荐.docx_第4页
第4页 / 共10页
java自定义协议解析Word文档下载推荐.docx_第5页
第5页 / 共10页
java自定义协议解析Word文档下载推荐.docx_第6页
第6页 / 共10页
java自定义协议解析Word文档下载推荐.docx_第7页
第7页 / 共10页
java自定义协议解析Word文档下载推荐.docx_第8页
第8页 / 共10页
java自定义协议解析Word文档下载推荐.docx_第9页
第9页 / 共10页
java自定义协议解析Word文档下载推荐.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

java自定义协议解析Word文档下载推荐.docx

《java自定义协议解析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《java自定义协议解析Word文档下载推荐.docx(10页珍藏版)》请在冰点文库上搜索。

java自定义协议解析Word文档下载推荐.docx

  importjava.io.outputstream;

  importjava.util.hashmap;

  importjava.util.map;

  importcom.my.socket.util.streamutil;

  publicclassserverhanderimplementsRunnable{

  privatesocketmysocket=null;

  privateFilesaveFiledirectory=null;

  publicserverhander(socketmysocket,FilesaveFiledirectory){

  super();

this.mysocket=mysocket;

this.saveFiledirectory=saveFiledirectory;

  @override

  publicvoidrun(){

  try{inputstreamin=mysocket.getinputstream();

byte[]headdata=streamutil.readhead(in);

//上传的文件头读入数组mapheadparamter=this.pareheader(newstring(headdata,myserverconstant.utF_8));

FilesaveFile=newFile(this.saveFiledirectory,headparamter.get(myserverconstant.File_name));

saveFile.exists())saveFile.createnewFile();

outputstreamfos=newFileoutputstream(saveFile);

byte[]buffer=newbyte[1024];

  while((len=in.read(buffer,0,1024))!

=-1){fos.write(buffer,0,len);

}fos.flush();

fos.close();

system.out.println("

end"

);

outputstreamos=mysocket.getoutputstream();

os.flush();

if(mysocket!

=null)mysocket.close();

}catch(ioexceptione){e.printstacktrace();

  privatemappareheader(stringparam){

  mapheadparamter=newhashmap();

if(param==null||"

"

.endswith(param))thrownewRuntimeexception("

上传的包是错误的!

string[]params=param.split("

;

for(strings:

params){

  headparamter.put(entry[0],entry[1]);

}returnheadparamter;

  5、一个读取文件头的工具类:

  packagecom.my.socket.util;

  importjava.io.bytearrayoutputstream;

  publicfinalclassstreamutil{

  privatestreamutil(){

  publicstaticbyte[]readhead(inputstreamin){

  bytearrayoutputstreambytearrayoutputstream=newbytearrayoutputstream();

  charc;

stringbuffersb=newstringbuffer();

try{while((c=(char)in.read())!

=-1){

  篇二:

基于java的udp协议编程

  基于java的udp协议编程

  摘要:

用户数据包协议(udp协议,userdatagramprotocol)是tcp/ip协议族中的一种,是工作在传输层的面向无连接的协议。

udp协议的主要作用是将网络数据流量压缩成数据包的形式。

本文将详细介绍基于java语言的udp协议编程,实现udp协议的功能。

关键字:

udp,java,udp协议编程

  baseonjavalanguageofudpprogramming

  abstract:

theuserdatagramprotocol(udp)isonekindoftheinternetprotocolsuite.itisaconnectionlessprotocolwhichisworkingonthetransportlayer.themainroleofudpismakingnetworkdatastreambecompressedintotheformofdatapacket.thispaperintroducesudpprogrammingwhichbasedonjavalanguageandachievesitsfunctionwithjavalanguageindetail.

  keywords:

udp,java,udpprogramming

  1引言

  如今,人们可以通过电脑来打电话,看电视,给朋友发送即时信息,与其他人玩游戏,甚至可以通过电脑买到你能想到的任何东西。

计算机程序能够通过互联网相互通信使这一切成为了可能。

很难统计现在有多少个人电脑接入互联网,但可以肯定,这个数量增长得非常迅速。

除此之外,新的应用程序每天在互联网上层出不穷。

随着日益增加的互联网访问带宽,我们可以预见,互联网将会对人们将来的生活产生长远的影响。

  那么程序是如何通过网络进行相互通信的呢?

各个孤立的工作站或主机用物理链路相连在一起,组成数据链路,从而达到资源共享和通信的目的,就形成网络。

通信是人与人之间同过某种媒体进行的信息交流与传递。

网络通信一般指网络协议。

当今网络协议有很多,其中基本最常用的就是tcp/ip协议族。

udp协议就是属于tcp/ip协议族中的协议。

在网络中它与tcp协议一样用于处理数据包。

在osi模型中,udp协议在第四层——传输层,处于ip协议的上一层。

与tcp相比,udp有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

  本文利用java语言网络编程的思想,编写udp协议程序,实现udp协议在网络中所要完成的功能。

在java语言为实现程序的相互通信提供了许多有用的抽象应用程序接口(api,applicationprogramminginterface),这类应用程序接口被称为套接字(sockets)。

因此,本文udp协议的编程所需要用到的接口就是(java,自定义协议,解析)套接字。

  2udp的介绍

  2.1udp简介

  udp是userdatagramprotocol的简称,中文全称是用户数据包协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

udp用来支持那些需要在计算机之间传输数据的网络应用。

包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用udp协议。

  2.2使用udp的原因(特点)udp协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,udp仍然不失为一项非常实用和可行的网络传输层协议。

这是因为udp有以下特点:

  

(1).udp是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

  

(2).由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

  (3).udp信息包的标题很短,只有8个字节,相对于tcp的20个字节信息包的额外开销很小。

  (4).吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。

  (5).udp使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。

  (6).udp是面向报文的。

发送方的udp对应用程序交下来的报文,在添加首部后就向下交付给ip层。

既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

  2.3udp套接字

  udp协议提供了一种不同于tcp协议的端到端服务。

实际上udp协议只实现两个功能:

  

(1).在ip协议的基础上添加了另一层地址(端口);

  

(2).对数据传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。

由于其简单性,udp套接字具有一些与我们之前所看到的tcp套接字不同的特征。

例如,udp套接字在使用前不需要进行连接。

tcp协议与电话通信相似,而udp协议则与邮件通信相似:

你寄包裹或信件时不需要进行“连接”,但是你得为每个包裹和信件指定目的地址。

类似的,每条信息(即数据报文,datagram)负载了自己的地址信息,并与其他信息相互独

  立。

在接收信息时,udp套接字扮演的角色就像是一个信箱,从不同地址发送来的信件和包裹都可以放到里面。

一旦被创建,udp套接字就可以用来连续地向不同的地址发送信息,或从任何地址接收信息。

  udp套接字与tcp套接字的另一个不同点在于他们对信息边界的处理方式不同:

udp套接字将保留边界信息。

这个特性使应用程序在接受信息时,从某些方面来说比使用tcp套接字更简单。

最后一个不同点是,udp协议所提供的端到端传输服务是尽力而为(best-effort)的,即udp套接字将尽可能地传送信息,但并不保证信息一定能成功到达目的地址,而且信息到达的顺序与其发送顺序不一定一致(就像通过邮政部门寄信一样)。

因此,使用了udp套接字的程序必须准备好处理信息的丢失和重排。

3udp协议编程

  3.1在java中udp协议编程可使用的相关类

  3.1.1inetaddress

  用于描述和包装一个internetip地址。

有如下方法返回实例:

  getlocalhost():

返回封装本地地址的实例。

  getallbyname(stringhost):

返回封装host地址的inetaddress实例数组。

  getbyname(stringhost):

返回一个封装host地址的实例。

其中,host可以是域名或者是一个合法的ip地址。

  inetaddress.getbyaddress(addr):

根据地址串返回inetaddress实例。

  inetaddress.getbyaddress(host,addr):

根据主机地符串和地址串返回

  inetaddress实例。

  3.1.2datagramsocket

  用于接收和发送udp的socket实例。

该类有3个构造函数:

  datagramsocket():

通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。

程序会让操作系统分配一个可用的端口。

  datagramsocket(intport):

创建实例,并固定监听port端口的报文。

通常用于服务端。

  datagramsocket(intport,inetaddresslocaladdr):

这是个非常有用的构建器,当一台机器拥有多于一个ip地址的时候,由它创建的实例仅仅接收来自localaddr的报文。

  datagramsocket具有的主要方法如下:

  

(1)receive(datagrampacketd):

接收数据报文到d中。

receive方法产生一个“阻塞”。

它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。

  

(2)send(datagrampacketdp):

发送报文dp到目的地。

  (3)setsotimeout(inttimeout):

设置超时时间,单位为毫秒。

  (4)close():

关闭datagramsocket。

在应用程序退出的时候,通常会主动释放资源,关闭socket,但是由于异常地退出可能造成资源无法回收。

所以,应该在程序完成时,主动使用此方法关闭socket,或在捕获到异常抛出后关闭socket。

  3.1.3datagrampacket

  用于处理报文,它将byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成byte数组。

应用程序在产生数据包是应该注意,tcp/ip规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。

  datagrampacket类的构建器共有4个:

  datagrampacket(byte[]buf,intlength):

将数据包中length长的数据装进buf数组,一般用来接收客户端发送的数据。

  datagrampacket(byte[]buf,intoffset,intlength):

将数据包中从offset开始、length长的数据装进buf数组。

  datagrampacket(byte[]buf,intlength,inetaddressclientaddress,intclientport):

从buf数组中,取出length长的数据创建数据包对象,目标是clientaddress地址,clientport端口,通常用来发送数据给客户端。

  datagrampacket(byte[]buf,intoffset,intlength,inetaddressclientaddress,intclientport):

从buf数组中,取出offset开始的、length长的数据创建数据包对象,目标是clientaddress地址,clientport端口,通常用来发送数据给客户端。

主要的方法如下:

  

(1)getdata():

从实例中取得报文的byte数组编码。

  

(2)setdate(byte[]buf):

将byte数组放入要发送的报文中

  3.2流程图

  udp应用程序原理图(如图1所示)

  图1

  udp应用程序流程图(如图2所示)

  图2

  篇三:

java5大开源协议

  开源界的5大开源许可协议

  越来越多的开发者与设计者希望将自己的产品开源,以便其他人可以在他们的代码基础上做更多事,开源社区也因此充满生机。

在我们所能想到的应用领域,都有开源软件存在(象wordpress,drupal这些开源cms)。

然而很多人对开源许可并不了解,本文介绍开源领域常用的几种许可协议以及它们之间的区别。

  什么是许可协议?

  什么是许可,当你为你的产品签发许可,你是在出让自己的权利,不过,你仍然拥有版权和专利(如果申请了的话),许可的目的是,向使用你产品的人提供一定的权限。

  不管产品是免费向公众分发,还是出售,制定一份许可协议非常有用,否则,对于前者,你相当于放弃了自己所有的权利,任何人都没有义务表明你的原始作者身份,对于后者,你将不得不花费比开发更多的精力用来逐个处理用户的授权问题。

  而开源许可协议使这些事情变得简单,开发者很容易向一个项目贡献自己的代码,它还可以保护你原始作者的身份,使你至少获得认可,开源许可协议还可以阻止其它人将某个产品据为己有。

以下是开源界的5大许可协议。

  1、gnugpl

  gnugeneralpubliclicence(gpl)有可能是开源界最常用的许可模式。

gpl保证了所有开发者的权利,同时为使用者提供了足够的复制,分发,修改的权利:

  可自由复制

  你可以将软件复制到你的电脑,你客户的电脑,或者任何地方。

复制份数没有任何限制。

  可自由分发

  在你的网站提供下载,拷贝到u盘送人,或者将源代码打印出来从窗户扔出去(环保起见,请别这样做)。

  可以用来盈利

  你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的gnugpl许可协议,以便让他们知道,他们可以从别的渠道免费得到这份软件,以及你收费的理由。

  可自由修改

  如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用gpl协议。

  需要注意的是,分发的时候,需要明确提供源代码和二进制文件,另外,用于某些程序的某些协议有一些问题和限制,你可以看一下@pierrejoye写的practicalguidetogplcompliance一文。

使用gpl协议,你必须在源代码代码中包含相应信息,以及协议本身。

  gnulgpl

  gnu还有另外一种协议,叫做lgpl(lessergeneralpubliclicence),它对产品所保留的权利比gpl少,总的来说,lgpl适合那些用于非gpl或非开源产品的开源类库或框架。

因为gpl要求,使用了gpl代码的产品必须也使用gpl协议,开发者不允许将gpl代码用于商业产品。

  lgpl绕过了这一限制。

  2、bsd

  bsd在软件分发方面的限制比别的开源协议(如gnugpl)要少。

该协议有多种版本,最主要的版本有两个,新bsd协议与简单bsd协议,这两种协议经过修正,都和gpl兼容,并为开源组织所认可。

  新bsd协议(3条款协议)在软件分发方面,除需要包含一份版权提示和免责声明之外,没有任何限制。

另外,该协议还禁止拿开发者的名义为衍生产品背书,但简单bsd协议删除了这一条款。

  3、mit

  mit协议可能是几大开源协议中最宽松的一个,核心条款是:

  该软件及其相关文档对所有人免费,可以任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。

唯一的限制是,软件中必须包含上述版权和许可提示。

  这意味着:

  你可以自由使用,复制,修改,可以用于自己的项目。

  可以免费分发或用来盈利。

  唯一的限制是必须包含许可声明。

  mit协议是所有开源许可中最宽松的一个,除了必须包含许可声明外,再无任何限制。

  4、apache

  apache协议2.0和别的开源协议相比,除了为用户提供版权许可之外,还有专利许可,对于那些涉及专利内容的开发者而言,该协议最适合(这里有一篇文章阐述这个问题)。

  apache协议还有以下需要说明的地方:

  永久权利

  一旦被授权,永久拥有。

  全球范围的权利

  在一个国家获得授权,适用于所有国家。

假如你在美国,许可是从印度授权的,也没有问题。

  授权免费,且无版税

  前期,后期均无任何费用。

  授权无排他性

  任何人都可以获得授权

  授权不可撤消

  一旦获得授权,没有任何人可以取消。

比如,你基于该产品代码开发了衍生产品,你不用担心会在某一天被禁止使用该代码。

  分发代码方面包含一些要求,主要是,要在声明中对参与开发的人给予认可并包含一份许可协议原文。

  5、creativecommons

  creativecommons(cc)并非严格意义上的开源许可,它主要用于设计。

creativecommons有多种协议,每种都提供了相应授权模式,cc协议主要包含4种基本形式:

  署名权

  必须为原始作者署名,然后才可以修改,分发,复制。

  保持一致

  作品同样可以在cc协议基础上修改,分发,复制。

  非商业

  作品可以被修改,分发,复制,但不能用于商业用途。

但商业的定义有些模糊,比如,有的人认为非商业用途指的是不能销售,有的认为是甚至不能放在有广告的网站,也有人认为非商业的意思是非盈利。

  不能衍生新作品

  你可以复制,分发,但不能修改,也不能以此为基础创作自己的作品。

  这些许可形式可以结合起来用,其中最严厉的组合是“署名,非商用,不能衍生新作品”,意味着,你可以分享作品,但不能改动或以此盈利,而且必须为原作者署名。

在这种许可模式下,原始作者对作品还拥有完全的控制权,而最宽松的组合是“署名”,意味着,只要为原始作者署名了,就可以自由处置。

  

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2