- 浏览: 529565 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
GGGGeek:
看完了博主的博文,如果没猜错的话应该是浙大吧?很多优秀的人因为 ...
转《D君的故事》 以时刻警示自己 -
游牧民族:
楼主写的不错,学习了,最近对爬虫比较感兴趣,也写了些爬虫相关的 ...
通用爬虫框架及heritrix爬虫介绍 -
jimmee:
jerome_s 写道ice 你怎么看? 粗略的看了一下ice ...
MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明 -
jerome_s:
ice 你怎么看?
MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明 -
jimmee:
nk_tocean 写道照着做了,但是不行啊,还是乱码.先确认 ...
hive编写udf处理非utf-8数据
1.TCP/IP协议要求信息必须在块(chunk)中发送和接收,而块的长度必须是8位的倍数,因此,我们可以认为TCP/IP协议中传输的信息是字节序列。如何发送和解析信息需要一定的应用程序协议。
2.信息编码:
首先是Java里对基本整型的处理,发送时,要注意:1)每种数据类型的字节个数;2)这些字节的发送顺序是怎样的?(little-endian还是big-endian);3)所传输的数值是有符号的(signed)还是无符号的(unsigned)。具体编码时采用位操作(移位和屏蔽)就可以了。具体在Java里,可以采用DataOutputStream类和ByteArrayOutputStream来实现。恢复时可以采用DataInputStream类和ByteArrayInputStream类。
其次,字符串和文本,在一组符号与一组整数之间的映射称为编码字符集(coded character set)。发送者与接收者必须在符号与整数的映射方式上达成共识,才能使用文本信息进行通信,最简单的方法就是定义一个标准字符集。具体编码时采用String的getBytes()方法。
最后,位操作。如果设置一个特定的设为1,先设置好掩码(mask),之后用或操作;要清空特定一位,用与操作。
3.成帧与解析
成帧(framing)技术解决了接收端如何定位消息的首位位置的问题。
如果接收者试图从套接字中读取比消息本身更多的字节,将可能发生以下两种情况之一:如果信道中没有其他消息,接收者将阻塞等待,同时无法处理接收到的消息;如果发送者也在等待接收端的响应消息,则会形成死锁(dealock);另一方面,如果信道中还有其他消息,则接收者会将后面消息的一部分甚至全部读到第一条消息中去,这将产生一些协议错误。因此,在使用TCP套接字时,成帧就是一个非常重要的考虑因素。
有两个技术:
1. 基于定界符(Delimiter-based):消息的结束由一个唯一的标记(unique marker)指出,即发送者在传输完数据后显式添加的一个特殊字节序列。这个特殊标记不能在传输的数据中出现。幸运的是,填充(stuffing)技术能够对消息中出现的定界符进行修改,从而使接收者不将其识别为定界符。在接收者扫描定界符时,还能识别出修改过的数据,并在输出消息中对其进行还原,从而使其与原始消息一致。
2. 显式长度(Explicit length):在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。这种方法要确定消息长度的上限,以确定保存这个长度需要的字节数。
接口:
定界符的方式:
显式长度方法:
2.信息编码:
首先是Java里对基本整型的处理,发送时,要注意:1)每种数据类型的字节个数;2)这些字节的发送顺序是怎样的?(little-endian还是big-endian);3)所传输的数值是有符号的(signed)还是无符号的(unsigned)。具体编码时采用位操作(移位和屏蔽)就可以了。具体在Java里,可以采用DataOutputStream类和ByteArrayOutputStream来实现。恢复时可以采用DataInputStream类和ByteArrayInputStream类。
其次,字符串和文本,在一组符号与一组整数之间的映射称为编码字符集(coded character set)。发送者与接收者必须在符号与整数的映射方式上达成共识,才能使用文本信息进行通信,最简单的方法就是定义一个标准字符集。具体编码时采用String的getBytes()方法。
最后,位操作。如果设置一个特定的设为1,先设置好掩码(mask),之后用或操作;要清空特定一位,用与操作。
3.成帧与解析
成帧(framing)技术解决了接收端如何定位消息的首位位置的问题。
如果接收者试图从套接字中读取比消息本身更多的字节,将可能发生以下两种情况之一:如果信道中没有其他消息,接收者将阻塞等待,同时无法处理接收到的消息;如果发送者也在等待接收端的响应消息,则会形成死锁(dealock);另一方面,如果信道中还有其他消息,则接收者会将后面消息的一部分甚至全部读到第一条消息中去,这将产生一些协议错误。因此,在使用TCP套接字时,成帧就是一个非常重要的考虑因素。
有两个技术:
1. 基于定界符(Delimiter-based):消息的结束由一个唯一的标记(unique marker)指出,即发送者在传输完数据后显式添加的一个特殊字节序列。这个特殊标记不能在传输的数据中出现。幸运的是,填充(stuffing)技术能够对消息中出现的定界符进行修改,从而使接收者不将其识别为定界符。在接收者扫描定界符时,还能识别出修改过的数据,并在输出消息中对其进行还原,从而使其与原始消息一致。
2. 显式长度(Explicit length):在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。这种方法要确定消息长度的上限,以确定保存这个长度需要的字节数。
接口:
import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }
定界符的方式:
import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DelimFramer implements Framer { private InputStream in;//data source; private static final byte DELIMTER=(byte)'\n';//message delimiter public DelimFramer(InputStream in){ this.in=in; } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { //ensure that the message dose not contain the delimiter for(byte b:message){ if(b==DELIMTER) throw new IOException("Message contains delimiter"); } out.write(message); out.write(DELIMTER); out.flush(); } @Override public byte[] nextMsg() throws IOException { ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream(); int nextByte; while((nextByte=in.read())!=DELIMTER){ if(nextByte==-1){//end of stream? if(messageBuffer.size()==0){ return null; }else{ throw new EOFException("Non-empty message without delimiter"); } } messageBuffer.write(nextByte); } return messageBuffer.toByteArray(); } }
显式长度方法:
import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class LengthFramer implements Framer { public static final int MAXMESSAGELENGTH=65535; public static final int BYTEMASK=0xff; public static final int SHOTMASK=0xffff; public static final int BYTESHIFT=8; private DataInputStream in;// wrapper for data I/O public LengthFramer(InputStream in) throws IOException{ this.in=new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if(message.length>MAXMESSAGELENGTH){ throw new IOException("message too long"); } //write length prefix out.write((message.length>>BYTEMASK)&BYTEMASK); out.write(message.length&BYTEMASK); //write message out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try{ length=in.readUnsignedShort(); }catch(EOFException e){ //no (or 1 byte) message; return null; } //0<=length<=65535; byte [] msg=new byte[length]; in.readFully(msg);//if exception,it's a framing error; return msg; } }
发表评论
-
[转载]并发之痛 Thread,Goroutine,Actor
2017-04-06 19:21 531转自 http://jolestar.com/pa ... -
JVM动态调整字节码
2016-04-14 19:27 1182粗略的点开btrace的源码看了一下,实际上他只是封装了JD ... -
java字节码常量池处理说明
2016-04-13 23:23 10571. 根据java的字节码格式说明,常量池中每一项的大小不一 ... -
Mac OSX 10.10 Yosemite编译OpenJDK 8
2016-04-03 18:14 3438编译时间:2016-04-03 系统版本:Mac OS ... -
Java 并发之 ConcurrentSkipListMap 简述
2015-09-20 20:24 1077JCIP 提到了在 Java 6 中引入了两个新的并发集合类 ... -
hbase等源码导入eclipse流程
2015-09-20 19:00 1658hbase: 1. 下载源码 svn co ht ... -
最简单的平衡树(红-黑树)的实现
2015-09-04 08:04 1120在二叉搜索树(BST)的基础上,要实现一颗平衡树,可以使用 ... -
多线程程序中操作的原子性[转载]
2014-12-06 10:49 11040. 背景 原子操作就是不可再分的操作。在多线程程序中原子 ... -
6. 内存屏障[转载]
2014-11-26 00:07 666原文地址 作者:Martin Thompson 译者: ... -
5.合并写(write combining)[转载]
2014-11-25 21:54 684原文地址 译者:无叶 ... -
4. 内存访问模型的重要性[转载]
2014-11-25 21:53 987在高性能的计算中,我 ... -
3. Java 7与伪共享的新仇旧恨[转载]
2014-11-25 21:45 820原文:False Shareing && J ... -
2. 伪共享(False Sharing)[转载]
2014-11-25 21:40 803作者:Martin Thompson 译者:丁一 缓存 ... -
lucene索引创建的理解思路
2014-06-29 23:12 1421虽然lucene4很早就出来,但是这里仍然以lucene3. ... -
lucene的拼写检查的实现原理
2014-06-08 18:19 12621. 建索引时, 使用ngram的方式创建索引 Sp ... -
字符串相似算法-(3) NGram Distance
2014-06-08 17:54 4844就是N-Gram version of edit dista ... -
字符串相似算法-(2) Levenshtein distance
2014-06-08 16:32 2152编辑距离概念描述: ... -
字符串相似算法-(1) Jaro-Winkler Distance
2014-06-08 12:05 6435Jaro-Winkler Distance 算法 ... -
tomcat参数编码处理过程
2014-06-07 09:49 17521. org.apache.coyote.http11 ... -
SSLEngine的示例
2014-05-26 19:44 7752为什么要使用SSLEngine, 参考javadoc的说明 ...
相关推荐
Java TCP/IP Socket编程 Java TCP/IP Socket编程 Java TCP/IP Socket编程
《Java TCP/IP Socket编程(原书第2版)》基于TCP/IP Socket相关原理,对如何在Java中进行Socket编程作了深入浅出的介绍。《Java TCP/IP Socket编程(原书第2版)》内容简明扼要,条理清晰,并在讲解相应的概念或编程...
java TCP/IP socket 编程(原书第2版)+部分源码,对于想学习java socket编程很有帮助!
Java TCP/IP Socket编程原书第2版.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
Java + TCP/IP+ Socket编程++ 原书第2版.pdf 中文版
现在几乎所有互联网应用程序都使用Java Socket进行通信,而本书专注的、教导式的方法,使读者能够快速掌握所有计算机通信的任务和技术要点。 本书特点: 对Socket编程的重点进行了集中简明的介绍,以使读者能够迅速...
实现了服务器与客户端功能的合二为一,客户端启动后,连接三次服务器,如果失败,则自己自动变为服务器。
在7CP/IP Socket首次发布时,Java作为一个新的未被关注的编程语 言刚出现。然而,自2001年以来,Java的网络编程能力已经得到了很大程度的扩展,而且 持续的应用优势已经使其成为了一个占主导地位的平台。考虑到Java...
Java TCP_IP Socket编程源代码书籍以及附带源码Java TCP_IP Socket编程源代码书籍以及附带源码
TCP/IP SOCKET 网络编程 多模式I/O网络开发
Cannot create TCP/IP socket(24).原因及解决办法
两本TCP/IP socket编程书,分别是C语言和Java语言版的。都是文字版的pdf文档。 1. TCP/IP Sockets in Java (2th Edtion) 2. TCP/IP Sockets in C *Series Editor: Michael J. Donahoo
Java TCP-IP Socket编程-卡尔弗特.pdf,结合java开发基于tcpip协议的socket编程
《Java TCP IP Socket编程(原书第2版)》
<Effective TCP/IP Programming>中文版,带书签,还算清晰
Java TCP_IP Socket编程(原书第2版)
《tcp/ip高效编程:改善网络程序的44个技巧》是tcp/ip 领域的经典著作,对tcp/ip 网络编程中存在的各种问题进行了全面解析,旨在帮助读者深入透彻地理解tcp/ip 网络编程。本书组织方式比较特别,正文部分包括4 章,将...
Java TCP-IP Socket编程(原书第2版)_41467.azw3