1.TCP和UDP的区别
1.1有连接和无连接
1.2可靠传输和不可靠传输
可靠传输意为发送方可以感知到接受方有没有接收到数据。
不可靠传输意为发送方不知道接收方有没有接收到数据。
1.3面向字节流和面向数据报
面向字节流:数据是以字节为单位,进行传输的。
这个就非常类似于 文件操作中的文件内容相关的操作中的字节流。
网络传输也是一样!
假设,现有100个字节的数据。
我们可以一直发完。
也可以 一次发 10个字节,发送十次。
也可以 一次发 2 个字节,发送50次。
…
面向数据报:
以数据报为单位,进行传输。
一个数据报都会明确大小。
一次 发送/接收 必须是 一个 完整的数据报。
不能是半个,也不能是一个半,必须是整数个。
1.4全双工和半双工
全双工:一条链路双向通信
半双工:一条链路,单向通信
2.UDP数据报
1)DatagramSocket(数据报套接字)
2)DatagramPacket(数据报 的数据包)
这两个都是关于UDP数据报的类:
3.写一个简单的客户端服务器程序
因为刚开始比较简单,因此这个程序就是我们发送什么,他就返回什么。
第一步:
第二步:启动服务器
第三步:
回显服务器代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpEchoServer {
//1.网络编程第一步先准备好socket实例
private DatagramSocket socket = null;
//port是服务器的端口号
public UdpEchoServer(int port) throws SocketException {
socket = new DatagramSocket(port);
}
//2.启动服务器
public void start() throws IOException {
System.out.println("启动服务器");
//UDP是不需要建立连接的,直接接收客户端发来的数据即可
while (true){
//1.读取客户端发来的请求
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024],1024);
//为了接收数据,需要事先准备好一个空的DatagramPacket对象,用receive来填充数据
socket.receive(datagramPacket);
//将datagramPacket解析成一个String
String request = new String(datagramPacket.getData(),0,datagramPacket.getLength(),"UTF-8");
//2.根据请求计算响应
String response = process(request);
//3.把响应写回客户端
DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
datagramPacket.getSocketAddress());
socket.send(responsePacket);
//打印具体的IP地址、端口号、请求和响应
System.out.printf("[%s:%d]resquest: %s,request: %s\n",datagramPacket.getAddress().toString()
,datagramPacket.getPort(),//客户端端口号
request,//请求
response);//响应
}
}
private static String process(String request){
return request;
}
public static void main(String[] args) throws IOException {
UdpEchoServer server = new UdpEchoServer(9090);
server.start();
}
}
因为我们没有写客户端,因此没有请求,自然服务器也就没有响应
4.客户端实现
代码展示:
package network;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
//站在客户端的角度:
//源IP:本机IP
//源端口:系统分配的端口
//目的IP:服务器IP
//目的端口:服务器的端口
//协议类型:UDP
public class UdpEc