一、网络简介
根据OSI把网络分为七个层次,分别是应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。其中网络层由IP协议进行传输,传输层由UDP和TCP协议传输。
UDP协议:
1、将数据及源和目的封装成数据包中,不需要建立连接。(封包,无连接)
2、每个数据包的大小限制在64k内。(小数据)
3、因无连接,是不可靠协议。(不可靠,丢数据)
4、不需要建立连接,速度快。(速度快)
TCP协议:
1、通过三次握手完成连接,是可靠协议。
2、面向连接的协议,速度慢,效率地。安全可靠。
二、UDP协议
UDP协议发送端:
1、建立UDP的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。
2、将数据封装成了数据包。
3、使用Socket服务的send方法将数据包发送。
public class Udp {
public static void main(String[] args) throws Exception {
// 1、指定端口,建立Socket
DatagramSocket ds = new DatagramSocket(8900);// 指定发送端口,不指定系统会自动分配。
// 2、定义要发送的数据。
String text = "UDP传输数据";
byte[] buf = text.getBytes();
// 3、将数据封装成了数据包。
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("202.199.73.80"), 8900);
// 4、用socket服务的send方法将数据包发送出去。
ds.send(dp);
// 5、关闭连接。
ds.close();
}
}
UDP协议接收端:
1、创建UDP的socket服务,指定要接收的端口,只有发送到这个端口的信息才能被接收。
2、定义用于存储接收到数据的数据包。
3、通过Socket服务的接收方法将收到的数据存储到数据包中。
4、通过数据包的方法获取数据包中的具体数据内容。
5、关闭资源。
public class UdpServer {
public static void main(String[] args) throws Exception {
// 1 创建Socket服务。
DatagramSocket ds = new DatagramSocket(8900);
// 2 定义字节数组,将接受到的数据存放到字节数组中。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 3 接受数据存放到数据包中
ds.receive(dp);// 该方法是阻塞式方法。
// 4 通过数据包获取端口,ip地址,传输的数据等信息。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
// 将字节数组中的有效部分转成字符串。
String text = new String(dp.getData(), 0, dp.getLength());
System.out.println(ip + ":" + port + "--" + text);
// 5 关闭资源。
ds.close();
}
}
三、TCP协议
两个端点的建立连接后会有一个传输数据的通道,在网络基础上的流,称之为socket流。该流中既有读取,也有写入。
1、创建客户端Socket和服务器端ServerSocket。
2、建立客户端和服务器端连接。
3、建立连接后,通过Socket中的IO流进行数据的传输。
4、关闭Socket。
TCP客户端:
public class TcpClient {
public static void main(String[] args) throws Exception {
// 创建客户端的Socket服务,指定目的主机ip和端口
Socket s = new Socket("202.199.73.80", 8900);
// 获取socket流中的输出流。
OutputStream out = s.getOutputStream();
//将数据转换为字节
out.write("TCP需要传输的数据".getBytes());
//关闭连接
s.close();
}
}
TCP服务器端:
public class TcpServer {
public static void main(String[] args) throws Exception {
// 建立服务端socket服务, 并且指定监听的端口
ServerSocket serverSocket = new ServerSocket(8900);
// 通过accept方法获取连接过来的客户端对象。
while (true) {
Socket s = serverSocket.accept();
//获取主机的IP地址
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "连接成功");
//获取客户端发来的输入流
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
//将读取的数据转换为字符串
System.out.println(new String(buf, 0, len));
s.close();// 关闭客户端.服务
}
}
}