什么是TCP?
TCP:Transmission Control Protocol 传输把握和谈TCP是一种面向连接(连接导向)的、靠得住的、基于字节俭的运输层(Transport layer)通信和谈,由IETF的RFC 793申明(specified)。在简化的策画机收集OSI模型中,它完成第四层传输层所指定的功能。应用层向TCP层发送用于网间传输的、用8位字节默示的数据流,然后TCP把数据流分别成恰当长度的报文段(凡是受该策画机连接的收集的数据链路层的最大传送单位(MTU)的限制)。之后TCP把成果包传给IP层,由它来经由过程收集将包传送给接管端实体的TCP层。TCP为了包管不产生丢包,就给每个字节一个序号,同时序号也包管了传送到接管端实体的包的按序接管。然后接管端实体对已成功收到的字节发还一个响应的确认(ACK);若是发送端实体在公道的往返时延(RTT)内未收到确认,那么对应的数据(假设丧失了)将会被重传。TCP用一个校验和函数来查验数据是否有错误;在发送和接管时都要策画校验和。
起首,TCP建树连接之后,通信两边都同时可以进行数据的传输,其次,他是全双工的;在包管靠得住性上,采取超时重传和捎带确认机制。
在流量把握上,采取滑动窗口和谈[1],和谈中规定,对于窗口内未经确认的分组须要重传。
在拥塞把握上,采取慢启动算法。
什么是UDP?
UDP 是User Datagram Protocol的简称, 中文名是用户数据包和谈,是 OSI 参考模型中一种无连接的传输层和谈,供给面向事务的简单不成靠信息传送办事。它是IETF RFC 768是UDP的正式规范。在收集中它与TCP和谈一样用于处理惩罚数据包。在OSI模型中,在第四层——传输层,处于IP和谈的上一层。UDP有不供给数据报分组、组装和不克不及对数据包的排序的毛病,也就是说,当报文发送之后,是无法得知其是否安然完全达到的。 UDP用来支撑那些须要在策画机之间传输数据的收集应用。包含收集视频会议体系在内的浩繁的客户/办事器模式的收集应用都须要应用UDP和谈。UDP和谈从问世至今已经被应用了很多年,固然其最初的名望已经被一些类似和谈所袒护,然则即使是在今天,UDP仍然不失为一项很是实用和可行的收集传输层和谈。
与所熟知的TCP(传输把握和谈)和谈一样,UDP和谈直接位于IP(网际和谈)和谈的顶层。按照OSI(开放体系互连)参考模型,UDP和TCP都属于传输层和谈。
UDP和谈的首要感化是将收集数据流量紧缩成数据报的情势。一个典范的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,残剩字节则用来包含具体的传输数据。
TCP和UDP在android中的应用和在Java里是完全一样的。
起首我们看看TCP连接,下图为TCP连接的一个示意图
是不是很好懂得,这里就不久不多说了,直接看代码吧!实践出真知。
TCP服务器端代码:
try {
Boolean endFlag = false;
ServerSocket ss = new ServerSocket(12345);
while (!endFlag) {
// 守候客户端连接
Socket s = ss.accept();
BufferedReader input = new BufferedReader(newInputStreamReader(s.getInputStream()));
//重视第二个参数据为true将会主动flush,不然须要须要手动操纵output.flush()
PrintWriter output = newPrintWriter(s.getOutputStream(),true);
String message = input.readLine();
Log.d("Tcp Demo", "message Client:"+message);
output.println("message received!");
//output.flush();
if("shutDown".equals(message)){
endFlag=true;
}
s.close();
}
ss.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
TCP客户端代码:
try {
Socket s = new Socket("localhost", 12345);
// outgoing stream redirect to socket
OutputStream out = s.getOutputStream();
// 重视第二个参数据为true将会主动flush,不然须要须要手动操纵out.flush()
PrintWriter output = new PrintWriter(out, true);
output.println("Hello IdeasAndroid!");
BufferedReader input = new BufferedReader(newInputStreamReader(s
.getInputStream()));
// read line(s)
String message = input.readLine();
Log.d("Tcp Demo", "message From Server:" + message);
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
下面我们看看UDP:
UDP办事器端代码:
// UDP服务器监听的端口
Integer port = 12345;
// 接管的字节大小,客户端发送的数据不克不及跨越这个大小
byte[] message = new byte[1024];
try {
// 建树Socket连接
DatagramSocket datagramSocket = new DatagramSocket(port);
DatagramPacket datagramPacket = new DatagramPacket(message,
message.length);
try {
while (true) {
// 筹办接管数据
datagramSocket.receive(datagramPacket);
Log.d("UDP Demo", datagramPacket.getAddress()
.getHostAddress().toString()
+ ":" + new String(datagramPacket.getData()));
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (SocketException e) {
e.printStackTrace();
}
UDP客户端代码:
public static void send(String message) {
message = (message == null ? "Hello IdeasAndroid!" : message);
int server_port = 12345;
DatagramSocket s = null;
try {
s = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
InetAddress local = null;
try {
// 换成办事器端IP
local = InetAddress.getByName("localhost");
} catch (UnknownHostException e) {
e.printStackTrace();
}
int msg_length = message.length();
byte[] messagemessageByte = message.getBytes();
DatagramPacket p = new DatagramPacket(messageByte, msg_length, local,
server_port);
try {
s.send(p);
} catch (IOException e) {
e.printStackTrace();
}
}