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()方法向客户端发送响应信息
- 关闭相关资源
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()方法监听服务端的响应消息
- 关闭相关资源
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实现一个聊天工具的示例代码