- 浏览: 38053 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (24)
- Java基础 (7)
- Struts2 (5)
- Spring2.0 (2)
- SpringSide (0)
- Hibernate (1)
- CSS (0)
- DB2 (1)
- DWR (0)
- JQuery (0)
- EXTJS (0)
- Flex (0)
- JBPM (0)
- JFM (0)
- JMS (0)
- JNDI (0)
- JSON (0)
- JUnit (0)
- Maven (0)
- MQ (0)
- NIO (1)
- LDAP (0)
- Portal (0)
- WebService (2)
- Java 规则引擎 (1)
- 精彩生活 (1)
- WebGIS (0)
- Eclipse (1)
- Web前端 (0)
- 兴趣文章 (1)
- HTML (0)
- Android2.x (0)
- JavaScript (0)
最新评论
-
makemyownlife:
写的不错 哈哈
struts2 参数传递 赋值 类型转化 -
eason26_li:
太深奥了
人工神经网络的典型模型
转:http://xzc520.iteye.com/blog/780617
java.net.NetworkInterface 提供了访问主机所有接口信息,etho0 lo0等
java.net.InetAddress
其它方法参看 java api 文档,掌握这两个类的使用。
TCP套接字
Socket ServerSocket
一个TCP 连接是一条抽象的双向信道,两端分别由IP地址和端口号确定。与电话相似.
示例:参看源码
客户端
a) 建立一个TCP连接,通过创建Socket实例并指定主机和端口.
b) 通过IO流传传输数据
c) 关闭连接.
服务端
a) 创建一个ServerSocket实例并指定本地端口。
b) 循环 调用accept()方法 ,并通过IO流传输数据
c) 关闭客户端连接。
UDP 套接字
DatagramPacket DatagramSocket
在IP协议的基础上增加了端口,对数据传输中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。包裹和信件相似.
示例:参看源码
客户端
a) 创建一个DatagramSocket实例,可以选择本地地址和端口号进行设置。
b) 使用DatagramSocket类的send()和receive()方法来发送和接收DatagramPacket实例,进行通信。
c) 通信完成关闭.DatagramSocket.close();
服务端
a) 创建一个DatagramSocket实例,指定本地端口,并可以选择指定本地地址,
b) 使用DatagramSocket类的receive()方法来接收一个DatagramPacket实例。
c) 使用send()和receive()方法 来与客户端进行通信。
数据的发送和接收
编码
信息编码对于byte int long char 等
对于超过一个字节的数据类型,需要知道字节顺序。
字节发送顺序 整数右边开始,由低位到高位发送,little-endian
左边开始,由高位到低位发送big-endian
long lnum = 123456787654321L
十六进制 0x0000704885F926B1
确定发送顺序
big-endian 0 0 112 72 133 249 38 177
little-endian 177 38 249 133 72 112 0 0
确定是否有符号
对于有符号整型,值以二进制补码`具体关于编码知识,可以参考更多资料。
ByteArrayOutputStream
DataOutputStream
writeByte()
wirteShort()
writeInt()
writeLong()
以上的方法将整数以适当大小的二进制补码的形式写到流中。 ]
字符串和文本
在一组符号与一组整数之间的映射称为编码字符集(coded character set)
常用的字符编码
ASCII 将英语字母,数字,标点符号以及一些特殊字符映射成0-127的整数.
Unicode
ISO-8859-1
Utf-8
UTF-16BE
GBKGB2313
BIG5
…
String
getBytes() -default charset
getBytes(“UTF-8”)
通过先将字符串转换成独立的字节,再将其写到流中的方式,把String写入OutputStream
还要指定编码方式。
位操作:布尔值编码
组合输入输出流
利用BufferdOutputStream 对OutputStream进行包装,就可以实现缓冲功能,提高效率
还有很多不同的包装类对流进行操作,详细查阅java.io.*包API文档。
成帧与解析
成帧是用来解决接收端定位消息首尾位置的问题。编码成文本,多字节二进制或是两者结合的信息,应用程序协议必须指定消息接收者如何确定消息已完整接收。
DatagramPacket 有指定长度
Tcp套接字没有边界概念,从套接字读取更多字节会出现
一 接收者阻塞等待 且 无法处理接收到的消息 一旦接收者在等待响应,则会死锁。
二 如果信道中还有其它消息,接收者会将后面消息的一部分甚至全部读到第一条消息中去,发生协议错误。
两个方法让接收者准确地找到消息的结束位置
基于定界符(delimiter-based): 消息的结束由一个唯一标记(unique marker) 发送者在传输完数据后显示添加一个特殊字节序列,这个特殊字节序列不出现在传输的数据中。消息本身不能包含定界字符,如果需要可以利用填充(stuffing)技术将出现的定界字符进行修改,接收者扫描定界符时,能识别出修改的数据。利用填充技术发送者和接收者都要扫描消息。
显式长度 explicit length: 在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。
参看源码中以下实现。
Framer
DelimFramer
LengthFramer
构建和解析协议消息
自定义协议的时候用到一些技术,举一个投票的实例来说明协议的定义过程.
一个简单投票协议,包括两种请求
查询(inquery)
客户端发送投票人ID,服务端返回 候选人ID和给定候选人票数.
投票(voting)
同上
几个用到的类 ,参数源码
消息类 指定了消息的类结构
VoteMsg 类,消息的结构类。
VoteMsgCoder 接口,用于对消息传输进行编码解码,分别用VoteMsgBinCoder 和 VoteMsgTextCoder 来实现接口,表示二进制编码或文本编码。
VoteService VoteServiceImpl 业务部分
TCPClient TCPServer 用于信息的发送和接收,需要对信息进行编码和解码,还需要用
到成帧技术。
UDPClient UDPSesrver
多任务处理
迭代服务器 处理完第一个客户请求之后,才会处理其它客户请求。
一客户端一线程 服务端中,为每个连接都创建一个新的线程来处理。
写一个处理类实现Runnable接口,用于处理客户端请求。
当有客户端连接的时候启动一个处理客户端的线程,并记录下线程的名字。
线程池 当线程数量过大时,系统会花费大量时间来处理上下转换和线程管理,没时间对客户请求进行处理。限制总线程数并重复使用线程可以解决些问题。创建一个固定大小线程组成的线程池。可以利用ExecutorService
newCachedThreadPool()
newFixedThreadPool()
newSingleThreadPool();
更多用法请参考java并发包的内容。
阻塞和超时 – 对于read(),accept(),receive()等方法会造成阻塞。
限制客户端访问时间,利用setSoTimeout()等方法来处理阻塞。
多接收者---网络提供了复制数据包的工作,而不是发送者,
单播 一对一的通信方式
多播 消息只是发送给一个多播地址,网络只是将数据分发给那些表示想要接收发送到该多播地址的数据的主机.只有UDP套接字允许广播和多播. 多播接收者需要加和一个组。
多播与单播主要区别是地址形式.IPV4 224.0.0.0-239.255.255.255 IPV6 是以FF 开头.
广播 (本地)网络中的所有主机 都会接收到一份数据副本,广播UDP数据报文和单播的报文相同,不同的是广播的地址不是常规的IP地址.IPV4 255.255.255.255
控制默认行为
Keep-Alive TCP协议提供了一种keep-alive的机制
发送和接收缓冲区大小 创建一个Socket或者DatagramSocket实例,操作系统就必须为其分配缓存区以存放接收和要发送的数据。
超时 i/o操作不能立即完成就会阻塞等待,设置最大阻塞时间,一旦超过就抛出异常。
地址重用 需要对多个套接字绑定到同一个套接字地址,或对于多播同一个主机上有多个应用程序加入了相同的多播组。这样就需要能够与正在使用的地址进行绑定的能力,要用到地址重用,setReuseAddress(true)
消除缓冲延迟时间 缓冲过程中会造成延迟,可以人为关闭。setTcpNoDelay().
紧急数据 可以优先到达接收端的数据。 setUrgentData(int data)….
关闭后停留 通过setSoLinger()方法 在close()的时候阻塞一段时间让缓冲区数据发送完成或者超时进行处理。
广播许可 java默认情况是可以广播的
通信等级 相当于数据在信息传输中具有的等级,至于标记数量和意义是取决于IP协议的版本。
基于性能的协议选择 setPerformancePreferences(int connectionTime,int latency,int bandwidth)
关闭连接 客户端关闭表示通信已经完成,Http是在服务端进行关闭。
发表评论
-
Spring3核心技术之事务管理机制
2013-08-01 06:48 826文章转至http://zhou137520.iteye.c ... -
理解 Java 的 GC 与 幽灵引用
2011-11-04 00:20 717http://www.iteye.com/topic/4 ... -
java 调用awt包 打开windows文件夹
2011-08-22 23:45 1762今天在公司想自己写个小工具,开机打开自己的工作日志 ... -
两步学会Java Socket编程
2011-08-22 23:36 795转自:http://bbs.51cto.com/thread- ... -
怎样将action转发到指定的iframe中
2010-05-05 23:51 1113------------------------------- ... -
showModalDialog导致Session失效
2009-12-28 00:17 2156转自:http://hi.baidu.com/dorachop ...
相关推荐
分析了微软Windows Socket对Berkley套接字的基本扩展,探讨了利用Socket实现网络通信的基本方法及相关函数,研究了采用Socket实现网络通信的若干关键技术和概念。提出了一种基于Delphi中的Socket解决网络通信的具体...
随着网络通信技术的不断发展,Socket开发和研究已成为... 本文从多个方面介绍了Socket的应用开发、实现环境以及工作流程,并用JAVA开发工具在Windows NT系统上实现网络通讯为例来对Socket套接字做了更加深入的介绍。
Socket编程是一种网络编程方式,它通过使用套接字(Socket)这个抽象的概念,允许应用程序在网络上与其他计算机进行通信。Socket编程提供了跨平台的通信能力,使得不同平台上的应用程序能够相互通信。 在Socket编程...
套接字是一组用于编写网络程序的API 常见的套接字有: --Windows平台 WinSock --Unix/Linux socket 套接字类型: --stream socket 面向流的一种套接字。 --datagram socket 面向数据报的一种套接字。 --raw ...
您只需告诉您的应用“使用systemd套接字或我的默认套接字”即可。 例子 var http = require('http'); var systemdSocket = require('systemd-socket'); var server = http.createServer(); // set up handlers for...
Delphi 源文件,应用 API 全代码实现的发送电子邮件源程序,可以向任何邮箱发送信息。
第9章 套接字选项和I/O控制命令 2079.1 套接字选项 2079.1.1 SOL_SOCKET选项级别 2089.1.2 SOL_APPLETALK选项级别 2159.1.3 SOL_IRLMP选项级别 2189.1.4 IPPROTO_IP选项级 2229.1.5 IPPROTO_TCP选项级别 2279.1.6 ...
Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 socket()函数 Python 中,我们用 socket()函数来创建套接字,语法格式如下: ...
传输层位于这个结构的最底层,当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。 而在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的...
Socket 是建立在传输层协议(主要是TCP 和UDP)上的一种套接字规范,最初由美国加州Berkley 大学提出,为UNIX 系统开发的网络通信接口,它定义了两台计算机之间通信的规范,socket 屏蔽了底层通信软件和具体操作...
1.套接字编程原理 1.1 Client/server 通信模型 1.2 Windows Sockets 规范 1.3 套接字 1.3.1 套接字定义 1.3.2 分类 1.3.3 套接字的作用 1.3.4 端口与地址 1.3.5 套接口属性 2.基本的Windows Sockets API 编程 2.1 ...
HttpSocketAdaptor 适用于Android的简单Http到原始套接字适配器HTTP套接字适配器是一个小型实用程序,它允许通过任何android网络浏览器与TCP套接字设备进行通信。 它使用localhost上的HTTP服务器接收来自ajax调用的...
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。...
应用背景服务器的示例代码使用插座。使用套接字客户端代码示例。设置TCP。关键技术Socket API。C为UNIX / Linux的目标。GCC编译器的建议。
标题带有客户端凭据实现的示例oAuth2.0服务器描述此实现的目的是为了保护没有用户登录名的应用程序从任何随机的未经授权的客户端保护服务api(网络服务)和套接字api(网络套接字连接)。 这里的用例是我们有两个...
eventsocket是FreeSWITCH的事件套接字的扭曲协议。 该协议在单个文件类中同时支持事件套接字的入站和出站方法。 它可以用于各种各样的目的。 它的目标是简单和可扩展,并将FreeSWITCH的所有功能导出到基于Twisted的...
网络编程,当然要用到Windows Socket(套接字)技术。Socket相关的操作由一系列API函数来完成,比如socket、bind、listen、connect、accept、send、sendto、recv、recvfrom等。调用这些API函数有一定的先后次序,有些...
在上使用本机消息传递API 和 ,我们正在与本机宿主应用程序( )交换消息,因此它将为我们完成所有套接字操作。 入门 去做 本机消息传递主机 Socketify API Chrome扩展程序 Firefox移植 安装指南 API文档 ...
Java应用程序或Andorid的阻塞套接字客户端。 Open source licenses Basic Socket Library Socket Server Plugin Library 中文在线文档 为了照顾中国同学的使用,提供了中文的说明文档: : OkEchoServer开源 由于...