一、网络编程三要素
二、UDP通信程序
发送数据
/**
* @date 2023/7/19
*/
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
/*
* 1. 创建DatagramSocket对象(快递公司)
* 细节:
* 绑定端口 我们以后就是通过这个端口往外发送数据
* 空参:所有可用的端口中随机一个进行使用
* 有参:指定端口号进行绑定
*/
DatagramSocket ds = new DatagramSocket();
// 2. 打包数据
String str = "小帅,你好威啊!";
byte[] message = str.getBytes();
// 发送给本机
InetAddress address = InetAddress.getByName("127.0.0.1");
// 发给10086 端口
int port = 10086;
DatagramPacket dp = new DatagramPacket(message, message.length, address, port);
// 3.发送数据
ds.send(dp);
// 4. 释放资源
ds.close();
}
}
接收数据
/**
* @date 2023/7/19
*/
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
/*
* 1. 创建DatagramSocket对象(快递公司)
* 细节:
* 绑定端口 我们以后就是通过这个端口往外发送数据
* 空参:所有可用的端口中随机一个进行使用
* 有参:指定端口号进行绑定
*/
DatagramSocket ds = new DatagramSocket();
// 2. 打包数据
String str = "小帅,你好威啊!";
byte[] message = str.getBytes();
// 发送给本机
InetAddress address = InetAddress.getByName("127.0.0.1");
// 发给10086 端口
int port = 10086;
DatagramPacket dp = new DatagramPacket(message, message.length, address, port);
// 3.发送数据
ds.send(dp);
// 4. 释放资源
ds.close();
}
}
tip:
启动时,先启动接收端,在启动发送端。
receive()方法时阻塞方法。
UDP的三种通信方式
- 单播
- 组播
- 广播
单播
之前写的代码就是单播 \color{#FF0000}{之前写的代码就是单播} 之前写的代码就是单播
组播
组播地址:
224.0.0.0
−
239.255.255.255
\color{#FF0000}{组播地址:224.0.0.0-239.255.255.255}
组播地址:224.0.0.0−239.255.255.255
其中:
224.0.0.0
−
224.0.0.255
为预留的组播地址
\color{#FF0000}{其中:224.0.0.0-224.0.0.255为预留的组播地址}
其中:224.0.0.0−224.0.0.255为预留的组播地址
接收端代码实现:
/**
* @date 2023/7/19
*/
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
// 1. 创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket(10086);
// 2. 将当前本机,添加到224.0.0.1的这一组中
InetAddress address = InetAddress.getByName("224.0.0.1");
ms.joinGroup(address);
// 3. 创建DatagramPacket数据包对象
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
// 4. 接收数据
ms.receive(dp);
// 5. 解析数据包
byte[] data = dp.getData();
int len = dp.getLength();
String ip = dp.getAddress().getHostAddress();
String hostName = dp.getAddress().getHostName();
System.out.println("ip为: " + ip + "主机为: " + hostName + "的人,发送了数据: " + new String(data, 0, len));
// 5. 释放资源
ms.close();
}
}
发送端代码实现:
/**
* @date 2023/7/19
*/
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
// 1.创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket();
// 2.打包数据
String str = "小帅,你好威啊!";
byte[] message = str.getBytes();
// 注意:地址为组播地址
InetAddress address = InetAddress.getByName("224.0.0.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(message, message.length, address, port);
// 3.发送数据
ms.send(dp);
// 4.释放资源
ms.close();
}
}
广播
广播地址:
255.255.255.255
\color{#FF0000}{广播地址:255.255.255.255}
广播地址:255.255.255.255
代码实现:
就是把单播发送端的IP改为255.255.255.255就可以了,其他代码和单播的一样
InetAddress address = InetAddress.getByName("255.255.255.255");
三、TCP通信程序
服务端代码实现(接收数据):
/**
* @date 2023/7/19
* @deprecated TCP协议接收数据
*/
public class TcpServer {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象
ServerSocket serverSocket = new ServerSocket(10086);
// 2.监听客户端的连接
Socket socket = serverSocket.accept();
// 3.从连接通道中获取输入流读取数据
// InputStream inputStream = socket.getInputStream();
// InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int len;
while ((len = br.read()) != -1){
System.out.print((char) len);
}
// 4.释放资源
socket.close();
serverSocket.close();
}
}
客户端代码实现(发送数据):
/**
* @date 2023/7/19
* @deprecated TCP协议发送数据
*/
public class TcpClient {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象
// 细节:在创建对象的同时会连接服务端
// 如果连接不上,代码会报错
Socket socket = new Socket("127.0.0.1", 10086);
// 2.可以从连接通道中获取输出流
OutputStream os = socket.getOutputStream();
// 写数据
os.write("小帅,你好威啊".getBytes());
// 3.释放资源
socket.close();
}
}