网络编程、UDP/TCP
一. 网络通信三要素
- IP地址, 要想让网络中的计算机能都互相通信,必须为每台计算机指定一个标识号,ip地址就是这个标识号
- 端口,网络的通信,本质上是两个应用程序之间的通信。如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序。也就是应用程序的标识
- 协议, 计算机在进行连接和通信时必须遵守一定的规则,这被称为网络通信协议,它对数据的传输格式,传输速率,传输步骤等做了统一的规定,通信双方必须同时遵守才能完成数据交换。常见的协议有UDP协议和TCP协议。
二. IP地址
常用命令
ipconfig: 查看本机IP地址
ping IP地址: 检查网络是否连通
特殊ip地址
127.0.0.1 是回送地址,可以代表本机地址
InetAddress
用于获取IP地址
+ InetAddress getByName(String host) 获取IP地址,参数可以是机器名称,也可以是IP地址, 这个既能拿自己的,也能拿别人的
+ getLocalHost () 只能取自己的
- getHostName() 获取主机名
- getHostAddress() 获取IP地址
二. 端口
#####三. 协议
计算机网络中,连接和通信的规则被称为网络协议
分为两种:
四. UDP通信程序
发送数据的步骤
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据包,并且把数据打包
- 调用DatagramSocket对象的方法发送数据
- 关闭发送端
// 创建发送端,默认会绑定自己的端口
DatagramSocket ds = new DatagramSocket();
// 创建发送数据,需要传参 - 数据,数据的长度,网络IP,端口号
byte[] bytes = "我是发送数据".getBytes();
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName("192.168.23.71"),10086);
// 发送
ds.send(dp);
// 关闭
ds.close();
接收数据的步骤
- 创建接收端的Socket对象(DatagramSocket)
- 创建一个数据包,用于接收数据
- 调用DatagramSocket对象的方法接收数据
- 解析数据包,并输出在控制台
- 关闭发送端
// 接收端
DatagramSocket ds = new DatagramSocket(10086);
// 创建一个接收包
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,by.length);
// 接收
ds.receive(dp);
// 查看数据
byte[] data = dp.getData();
// 接收到的数据可能后面还有空数据, 拿到长度,只取有数据的
int len = dp.getLength();
System.out.println(new String(data,0,len));
// 关闭
ds.close();
案例
UDP发送数据:
数据来自于键盘录入,直到输入的数据是886,发送数据结束
UDP接收数据:
因为接收端不知道发送端什么时候停止发送,故采用死循环接收
// 发送端
//创建发送端的Socket对象(DatagramSocket)
DatagramSocket socket = new DatagramSocket();
//创建数据,并把数据打包
while (true) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要发送的内容");
String s = sc.next();
if (!s.equals("886")) {
DatagramPacket dp = new DatagramPacket(
s.getBytes(),
s.getBytes().length,
InetAddress.getByName("172.20.10.6"),
10086);
//调用DatagramSocket对象的方法发送数据
socket.send(dp);
} else {
break;
}
}
//关闭发送端
socket.close();
// 接收端
//创建接收端的Socket对象(DatagramSocket)
DatagramSocket socket = new DatagramSocket(10086);
//调用DatagramSocket对象的方法接收数据
while (true) {
//创建一个数据包,用于接收数据
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by, by.length);
socket.receive(dp);
//解析数据包,并把数据在控制台显示
String s = new String(dp.getData(), 0, by.length);
System.out.println("接收打的数据: " + s);
}
五. TCP发送数据
发送数据的步骤
- 创建Socket对象
- 获取输出流,写数据
- 释放资源
// 创建socket
Socket socket = new Socket("172.20.10.6",10000);
// 获取它的输出流
OutputStream os = socket.getOutputStream();
os.write("tcp, 我来了。".getBytes());
// 关闭
os.close();
socket.close();
接收数据的步骤
- 创建ServerSocket对象
- 侦听并接受
- 获取输入流,读数据,并把数据显示在控制台
- 释放资源
// 创建
ServerSocket ss = new ServerSocket(10000);
// 侦听并接受
Socket accept = ss.accept();
// 获取输入流
InputStream its = accept.getInputStream();
byte[] by = new byte[1024];
int len;
while ((len = its.read(by)) != -1) {
System.out.println("接收到的数据是:" + new String(by, 0, len));
}
// 关闭
its.close();
ss.close();