1.说明
Socket(套接字)是计算机网络编程中用于实现网络通信的一种编程接口或抽象概念。
它提供了一种标准的接口,使应用程序能够通过网络与其他计算机进行通信。
Socket可以看作是应用程序与网络之间的一个通信端点,类似于电话中的插座。
通过Socket,应用程序可以创建、连接、发送和接收数据,以实现网络通信。
Socket通常使用TCP/IP协议栈作为底层网络协议,
但也可以与其他协议一起使用,
如UDP(User Datagram Protocol)和ICMP(Internet Control Message Protocol)等。
Java中基于UDP协议实现网络通信的类:
- DatagramPacket数据包类
- DatagramSocket端到端通信的类
服务端和客户端都使用DatagramSocket进行通信,
只是使用的细节上面有些区别。
2.服务端编程
服务端使用DatagramSocket编程步骤:
- 创建DatagramSocket对象,绑定监听端口
- 通过receive()方法监听客户端请求
- 通过send()方法向客户端发送响应信息
- 关闭相关资源
java">package edu.java.net.socket.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
*UDP Socket 套接字服务端
*/
public class DatagramSocketServer {
public static void main(String[] args) throws Exception {
// 1.创建UDP服务器端,指定监听端口
DatagramSocket socket = new DatagramSocket(10085);
// 2.创建数据包,用于接收客户端发送的数据
byte[] reqData = new byte[1024];
DatagramPacket reqPacket = new DatagramPacket(reqData, reqData.length);
// 3.接受客户端发送的数据
// 此方法阻塞直到接收到数据
System.out.println("服务端已经启动...");
socket.receive(reqPacket);
// 4.读取数据
String info = new String(reqPacket.getData(), 0, reqPacket.getLength());
System.out.println("服务端接收到消息:" + info);
// 5.向客户端响应数据
// 获取客户端的地址,端口号
InetAddress address = reqPacket.getAddress();
int port = reqPacket.getPort();
// 要返回客户端的数据
byte[] rspData = "欢迎您访问服务端!".getBytes();
// 创建数据报,包含响应的数据信息
DatagramPacket rspPacket = new DatagramPacket(rspData, rspData.length, address, port);
socket.send(rspPacket);
// 6.关闭资源
socket.close();
}
}
3.客户端编程
客户端使用Socket编程步骤:
- 创建DatagramSocket对象
- 创建DatagramPacket对象,指定服务端IP和端口及要发送的数据
- 通过send()方法向服务端发送请求信息
- 通过receive()方法监听服务端的响应消息
- 关闭相关资源
java">package edu.java.net.socket.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
*UDP Socket 套接字客户端
*/
public class DatagramSocketClient {
public static void main(String[] args) throws Exception {
// 1.设置服务端的地址,端口号
InetAddress address = InetAddress.getByName("localhost");
int port = 10085;
// 2.创建发送的数据包
byte[] sendData = "我是admin用户".getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
// 3.创建DatagramSocket对象,向服务器发送数据
DatagramSocket socket = new DatagramSocket();
socket.send(sendPacket);
// 4.创建接收数据报,用于接受服务器端响应数据
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.receive(receivePacket);
String reply = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("客户端收到服务端消息:" + reply);
// 5.关闭资源
socket.close();
}
}
4.服务端多线程编程
实际场景中,一个服务端往往可以支持多个客户端的连接,为多个客户端提供服务。
请参考Java UDP实现一个聊天工具的示例代码