- 浏览: 31291 次
- 性别:
- 来自: 宁波
文章分类
最新评论
-
zpd00001:
大道理,刚毕业的菜鸟们是不懂的- -!!
毕业后五年之内将决定你的一生 人生与励志 -
li_47195:
看完后我沉默很久..所谓“优秀生”?..一篇转载,献给所有和我一样迷茫没有目标的人
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):在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。这种方法要确定消息长度的上限,以确定保存这个长度需要的字节数。
接口:
Java代码 收藏代码
定界符的方式:
Java代码 收藏代码
显式长度方法:
Java代码 收藏代码
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):在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。这种方法要确定消息长度的上限,以确定保存这个长度需要的字节数。
接口:
Java代码 收藏代码
import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }
定界符的方式:
Java代码 收藏代码
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(); } }
显式长度方法:
Java代码 收藏代码
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; } }
发表评论
-
【转】PC安卓模拟器PANIC: Could not open:C:\Documents and Settings\Administrator\.android
2013-03-13 23:43 816在初次运行Android程序的 ... -
再谈重入锁--ReentrantLock
2012-12-26 20:50 402重入锁(ReentrantLock)是一种递归无阻塞的同步机制 ... -
Spring 设置支态定时任务
2012-11-27 12:27 649什么是动态定时任务:是由客户制定生成的,服务端只知道 ... -
Java TCP/IP Socket 编程 笔记(三)—UDP的例子
2012-10-29 19:53 9091.UDP套接字与TCP套接字 ... -
Java TCP/IP Socket 编程 笔记(二)—TCP的例子
2012-10-29 19:49 7551.InetAddress类和SocketAddress用于 ... -
Java TCP/IP Socket 编程 笔记(一)—基本概念
2012-10-29 19:42 856一些概念: 通信信道(communication c ... -
java并发编程不得不知道的几件事(转载)
2012-10-29 19:31 646多线程编 ... -
Web.XML 配置详解
2012-09-07 11:56 578每一个站的WEB-INF下都有一个web.xml的设定文件, ... -
java 多线程编程需要注意的23条
2012-08-13 15:56 5741.多线程中有主内存和 ... -
感受Java中的多线程设计
2012-08-13 15:49 655我就不说最初那个单核CPU时代了,我们从多进程编程开始讲。 ... -
排序算法(JAVA)(二)归并排序,堆排序,桶式排序,基数排序
2012-07-11 09:05 544六 归并排序 算法思想是每次把待排序列分成两部分,分别对这两部 ... -
排序算法(JAVA)(一)插入排序,冒泡排序,选择排序,Shell,快速排序
2012-07-11 08:59 724为了便于管理,先引入个基础类: package algor ... -
理解ThreadLocal
2012-04-28 16:05 0ThreadLocal是什么 早在JDK ... -
Java反射机制
2011-12-31 13:16 668http://www.cnblogs.com/Quincy/ ... -
Java5.0多线程编程
2011-11-22 16:00 706[size=large] Lock接口 ReentrantL ... -
Java Map遍历的方法
2011-11-09 19:41 833第一种:利用entryset遍历 Map map = ne ... -
Java常见异常汇总
2011-11-09 19:27 661转自于: http://www.javaask.com/jav ... -
java io/流
2011-11-09 19:20 481[转]JAVA IO流 http://www.blogjava ... -
Java:使用synchronized和Lock对象获取对象锁
2011-11-07 12:43 545原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 ... -
Java线程:创建与启动
2011-10-31 13:50 598一、定义线程 1、扩展 ...
相关推荐
使用sendto()函数发送数据到指定的IP地址和端口,而recvfrom()函数接收来自任何来源的数据。 **学习笔记概览** "TCP_UDP_Socket学习笔记.md" 文件很可能会详细阐述这些概念,包括如何创建和使用Socket对象,如何...
首先,Socket是网络通信的接口,它提供了一种标准的方式让应用程序能够发送和接收数据。在TCP/IP协议栈中,Socket扮演着客户端与服务器端通信的桥梁角色。Socket分为两种类型:流式Socket(TCP)和数据报Socket(UDP...
Socket的工作原理是通过创建Socket对象,在客户端和服务器端之间建立连接,并通过发送和接收数据来实现通信。 Java中Socket的使用 在Java编程语言中,Socket可以通过java.net包中的Socket类和ServerSocket类来实现...
5. **UDP编程**:UDP是一种无连接的协议,使用`DatagramSocket`接收和发送数据报。由于不保证数据顺序和可靠性,适用于对实时性要求高的场景,如视频流或在线游戏。 6. **HTTP协议与Web服务**:Java可以用来创建...
本项目通过实际操作加深了学生对于TCP/IP协议以及socket编程的理解。通过搭建Android客户端与服务器端的通信框架,并利用服务器作为中间件访问MySQL数据库,不仅锻炼了学生的编程实践能力,还帮助他们掌握了网络编程...
Socket API允许创建套接字连接,进行数据的发送和接收,从而实现客户端和服务器之间的交互。 总结,Java网络编程基础不仅包括对网络协议的理解,如TCP/IP,还涉及到对OSI模型的深入认识,理解每一层的功能和它们...
`Send`类负责发送数据,`Receiver`类负责接收数据。每个类都是一个线程,分别处理发送和接收操作。发送端将用户输入的数据封装成`DatagramPacket`并通过`send()`方法发送,接收端则通过`receive()`方法接收数据包。 ...
2. TCP发送和接收数据: - tkSocket.java中服务端代码使用了DataOutputStream和DataInputStream来进行数据的发送和接收。服务端首先监听9999端口,等待客户端的连接。当连接建立后,服务端会发送数据,并接收客户端...
在Java中,Socket编程主要依赖于`java.net.Socket`和`java.net.ServerSocket`类,它们是Java网络编程的基础。 Socket在网络通信中有两种主要类型: 1. **DatagramSockets(数据报套接字)**:基于UDP协议,适用于...
客户端通过Socket连接到服务器,然后发送和接收数据。Java的`java.net.Socket`类代表客户端,而`java.net.ServerSocket`类用于服务器,监听特定端口上的连接请求。 **TCP/IP协议**是传输控制协议/因特网协议的缩写...
百度地图开发java源码 1 开始网络编程 1.1 理解网络编程和套接字 linux 头文件 #include windows 头文件 #include 基于linux平台的实现 网络编程结束连接请求的套接字创建过程为 1. 调用socket函数创建套接字 int ...
Socket是操作系统提供的一个接口,它允许应用程序通过这个接口发送和接收数据。在TCP/IP协议栈中,Socket分为两种类型:流式Socket(TCP)和数据报Socket(UDP)。TCP提供的是面向连接、可靠的服务,而UDP则是一种无...
至此,服务端已准备好处理客户端的连接请求,可以进行进一步的通信操作,如发送和接收数据。 总的来说,Socket网络编程是构建网络应用的关键,涉及IP地址操作、DNS解析和Socket服务端监听等核心技术。理解并掌握...
在Android平台上,开发一个Socket服务器是一项常见的任务,它允许设备与其他设备或...开发者需要根据应用的需求选择合适的协议,并正确处理数据的发送和接收。理解这些基础概念对于进行高效、可靠的网络通信至关重要。
Socket提供了一种标准的接口,使得应用程序可以通过该接口发送和接收数据。在Java中,Socket类和ServerSocket类是进行TCP通信的主要工具。ServerSocket用于监听客户端的连接请求,而Socket则代表一个网络连接,用于...
在`client`和`server`这两个文件中,`client.java`应该包含了客户端的代码,它会打开到服务器的连接,发送数据,然后接收服务器的响应。而`server.java`则是服务器端的代码,它会设置监听,接收客户端的连接,然后...
这部分可能包括了TCP/IP协议的理解,`Socket`和`ServerSocket`类的使用,以及如何进行数据的发送和接收。作者可能也讨论了异常处理和连接关闭的方法。 5. **学习笔记**:这些代码不仅展示了实际的编程技巧,而且每...
学习Socket编程,不仅需要理解基本概念,还要动手实践,通过编写客户端和服务器端程序,理解数据的收发过程。同时,了解TCP和UDP的区别,以及如何选择合适的协议,也是必不可少的。 通过阅读提供的“SOCKET基础...
通过这些对象,开发者可以实现数据的发送和接收,进行网络通信。同时,Java NIO(非阻塞I/O)库提供了更高效的网络编程模型,可以处理大量并发连接。 总的来说,Java网络编程涉及到了计算机网络的多个层次,理解OSI...