Javatcp/ipsocket编程

基本概念

套接字(socket)

为实现程序间相互通信的编程应用接口(API),分为流套接字和数据报套接字

tcp

流套接字提供了一种可信赖的字节流服务

一个tcp/ip套接字由一个互联网地址,一个端到端协议和一个端口号确定

ip

用互联网地址标识

uri

统一资源标识符,包括url

url

统一资源定位符

udp

用户数据报协议

提供了一个尽力而为的数据报服务,可以发送最长为65500字节的信息

拓展概念

使接受者准确地找到消息的结束位置

方法1:基于定界符,消息的结束由一个唯一的标记指出,即消息的发出者在传输完整数据后显式添加一个特殊字节序列。这个特殊标记不能再传输数据中出现。(推荐使用单字节的特殊符号,例如:\n,这样可以直接在扫描读取信息的过程中进行判断)

方法2:显式长度,在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。

成帧与解析

成帧技术解决了接收端如何定位消息的首尾位置的问题。

解析就是找到消息。最简单的方法就是先定位消息的结束位置,然后将消息作为一个整体进行解析。

阻塞

监听过程会阻塞。

执行读数据方法却没有数据时会发生阻塞。

写数据时没有足够的空间缓存传输的数据时会出现阻塞。

超时

保持活跃

setKeepAlive(true)

该机制在经过一段不活跃的时间后,将想另一个终端发出一个探测消息。如果另外一端还处于活跃状态就返回一个确认消息。如果经过几次尝试都没有收到确认消息,则终止发送探测消息,关闭套接字,并在下一次尝试io操作时抛出异常。

发送和接受缓存区大小

地址重用

消除缓冲延迟

紧急数据

要发送紧急数据需要调用sendUrgentData()方法,它将发送其int参数的最低位字节。要接受这个字节,必须设置setOOBInline(true)启用接收者对频道外数据的接受。

Java中紧急数据几乎没有什么用,因为紧急数据与常规字节按照传输顺序混在一起。实际上接收者并不能区分。

关闭后停留

如果关闭后缓冲区还有没有发出去的数据,可能主机在后面某一个时刻出现故障。

可以设置关闭后停留,setSoLinger(true),那么再调用close()方法将阻塞等待,直到远程终端对所有数据都返回了确认信息,或发生了指定的超时。

广播许可

通信等级

基于性能的协议选择

Tcp不是套接字的唯一可选协议

使用netstat命令监控tcp连接状态

详情看netstat-help

nio

采用非阻塞方式

多任务处理

名称

方法

详细描述

一客户一线程

一个监听,每个socket一个线程

线程池

N个线程N个监听

关闭连接

关闭输入流或输出流

关闭输出流可以输出结束标志-1,但不可以继续输出数据。

关闭socket

关闭连接是协议中关键的一部分,一端调用close()发出关闭请求(close_wait),对方会读取到数据结束的-1标志,然后自动调用close()。

常用API

InetAddress

ServerSocket

Socket

DatagramPacket

接受数据实例

DELIMITER=\n;

inti=0;

byte[]data=null;

while((nextByte=in.read())!=DELIMITER){

if(data==null){

//in.available必须在in有数据的时候才能使用,已经读取的一个字节要加上

data=newbyte[in.available+1];

}

data[i]=nextByte;

i++;

if(nextByte==-1){

//数据已经读完

break;

}

}