首先我们要明白TCP/IP模型分为:应用层、传输层、网际层、主机至网络层。
我们现在讨论的都在应用层中。
•
网络通讯要素:
IP
地址、端口号、传输协议(名称定义不懂的请百度)
我们来看看TCP和UDP有什么区别:
•TCP/
传输控制协议:
1.需要建立连接
2.大数据量传输
3.传输过程可概括为三次握手和四次挥手
4.效率相对低
5.可靠协议
•UDP/
用户数据报协议:
1.数据封装,不需要建立连接
2.地址不管存不存在,只负责传输
3.不可靠协议
4.数据报大小限制
64K
,不能太大
5.效率相对高
之前在网上看到一个有意思的比喻是:
把TCP比喻为打电话:要建立起同步连接才能通信,确保信息一定能传达。
把UDP比喻为发短信:反正只要发信息出去就OK,不管你收没收到,不确保信息传达。
接下来我们来看看UDP的传输实现过程(自己写的时候也按照这个过程写)
•
创建
UDP
发送端:
•1.
建立
udp的
socket
•2.
将要发送的数据封装到数据包中
•3.
通过
socket的
send
将数据包发送出去
•4.
关闭
socket
•UDP
接收端:
•1.
建立
udp的
socket
,必须要明确端口号
•2.
创建数据包,用于存储接收到的数据,方便用数据包的方法解析数据
•3.
通过
socket的
receive
将接收的数据存储到数据包中
•4.
通过数据包的方法解析数据包中的数据(地址端口数据内容)
•5.
关闭
然后来看看TCP的传输实现过程(自己写的时候也按照这个过程写)
•
客户端:
•1.
创建
Socket,最好明确连接主机、端口
•2.
连接成功时,
socket流已经建立,
•
可以通过
getoutput
/
inputStream
获取两个字节流
•3.
使用输出流
•4.
关闭
•
服务端:
•1.
创建
ServerSocket
•2.
必须提供端口
•3.
获取连接的客户端对象
•4.
通过客户端对象获取
socket
流读取数据
UDP示例:
package junitTest;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPTest2_receive {//接收端
public static void main(String[] args) throws Exception {
System.out.println("B:");
DatagramSocket ds1 = new DatagramSocket(10000);
while (true) {
byte[] by1 = new byte[1024];
DatagramPacket dp1 = new DatagramPacket(by1, by1.length);
ds1.receive(dp1);
String ip = dp1.getAddress().getHostAddress();
int port = dp1.getPort();
String text = new String(dp1.getData(), 0, dp1.getLength());
System.out.println(ip + " " + port + ": " + text);
}
}
}
package junitTest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPTest2_Send {//发送端
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("A:");
DatagramSocket ds1 = new DatagramSocket();
String str1 =null ; byte[] Abyte = new byte[1024];
while((str1=br.readLine())!=null){
System.out.println("input:");
Abyte = str1.getBytes();
DatagramPacket dp1 = new DatagramPacket(Abyte, Abyte.length, InetAddress.getLocalHost(),10000);
ds1.send(dp1);
}
ds1.close();
}
}
将在下一篇贴出UDP实现简单同步聊天的功能