Java入门第152课——DatagramSocket实现客户端与服务端通信

时间:2024-10-25 19:26:13

步骤一:创建客户端和服务端类

首先,创建类Client表示客户端;然后,创建类Server表示服务端,Client类代码如下所示:

  1. public class Client {
  2. public static void main(String[] args){
  3. }
  4. }

Server类代码如下所示:


  1. public class Server {
  2. public static void main(String[] args){
  3. }
  4. }

步骤二:客户端向服务器发送数据,服务器端接收该数据

要实现客户端向服务器端发送数据“Hello!I m Client”,详细过程如下:

1)创建Socket实例。在Client类中新建start方法,在该方法中,创建用于接收和发送UDP的DatagramSocket类的实例。客户端使用无参数的构造方法构造DatagramSocket类的实例即可。

2)构建发送包。使用如下构造方法来构造数据包DatagramPacket类的对象:

DatagramPacket(byte[] buf,int length,InetAddress clientAddress,int clientPort)

上述构造方法表示从buf数组中,取出length长度的数据创建数据包对象,该数据包的目标地址是clientAddress、端口是clientPort。本案例的目标IP地址是127.0.0.1,即本机、目标端口是8088.

3)发送数据。使用DatagramSocket类提供的send方法,向目标地址和端口发送报文。

Client类代码如下所示:

  1. import ;
  2. import ;
  3. import ;
  4. public class Client {
  5. private void start() {
  6. try{
  7. DatagramSocket client = new DatagramSocket();
  8. String sendStr = "Hello! I m Client";
  9. byte[] sendBuf;
  10. sendBuf = ();
  11. InetAddress addr = ("127.0.0.1");
  12. int port = 8088;
  13. DatagramPacket sendPacket = new DatagramPacket(sendBuf,,addr,port);
  14. (sendPacket);
  15. } catch (Exception e) {
  16. ();
  17. }
  18. }
  19. public static void main(String[] args) {
  20. }
  21. }

要实现服务端接收客户端发送的数据,详细过程如下:

1)创建Socket实例。在Server类中新建start方法,在该方法中,首先创建用于接收和发送UDP的DatagramSocket(int port)来构造DatagramSocket类的实例。该构造方法可以固定监听port端口的报文。

2)构建接收包。使用如下构造方法来构造数据包DatagramPacket类的对象:

DatagramPacket(byte[] buf, int length)

上述构造方法表示将数据包中length长度的数据装进buf数组。

3)接收数据。使用DatagramSocket类的receive方法接收数据报文。

Server类代码如下所示:

  1. import ;
  2. import ;
  3. import ;
  4. public class Server {
  5. public void start() {
  6. try{
  7. DatagramSocket server = new DatagramSocket(8088);
  8. byte[] recvBuf = new byte[100];
  9. DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
  10. (recvPacket);
  11. String recvStr = new String((), 0, ());
  12. ("客户端说:" + recvStr);
  13. } catch (Exception e) {
  14. ();
  15. }
  16. }
  17. public static void main(String[] args) {
  18. }
  19. }

步骤三:服务器向客户端发送数据,客户端接收数据

要实现服务器向客户端发送数据"Hello ! I m Server",详细过程如下:

1)构建发送包。从上一步客户端发送的数据包中获取客户端的地址和端口号,使用如下构造方法来构造数据包DatagramPacket类的对象:

DatagramPacket(byte[] buf, int length, InetAddress clientAddress, int clientPort)

上述构造方法表示从buf数组中,取出length长度的数据创建数据包对象,该数据包对象的目标地址是clientAddress、端口是clientPort。

2)发送数据,使用DatagramSocket类提供的send方法,向目标地址和端口发送报文。

Server类代码如下所示:

  1. import ;
  2. import ;
  3. import ;
  4. public class Server {
  5. public void start() {
  6. try{
  7. DatagramSocket server = new DatagramSocket(8088);
  8. byte[] recvBuf = new byte[100];
  9. DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
  10. (recvPacket);
  11. String recvStr = new String((), 0, ());
  12. ("客户端说:" + recvStr);
  13. int port = ();
  14. InetAddress addr = ();
  15. String sendStr = " Hello ! I m Server");
  16. byte[] sendBuf;
  17. sendBuf = ();
  18. DatagramPacket sendPacket = new DatagramPacket(sendBuf,, addr, port);
  19. (sendPacket);
  20. ();
  21. } catch (Exception e) {
  22. ();
  23. }
  24. }
  25. public static void main(String[] args) {
  26. }
  27. }

 客户端接收数据的过程和服务器端接收数据的过程类似,在这里不再赘述。

Client类代码如下所示:

  1. import ;
  2. import ;
  3. import ;
  4. public class Client {
  5. private void start() {
  6. try{
  7. DatagramSocket client = new DatagramSocket();
  8. String sendStr = "Hello! I m Client";
  9. byte[] sendBuf;
  10. sendBuf = ();
  11. InetAddress addr = ("127.0.0.1");
  12. int port = 8088;
  13. DatagramPacket sendPacket = new DatagramPacket(sendBuf,,addr,port);
  14. (sendPacket);
  15. byte[] recvBuf = new Byte[100];
  16. DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
  17. (recvPacket);
  18. String recvStr = new String((), 0, ());
  19. ("服务端说:" + recvStr);
  20. ();
  21. } catch (Exception e) {
  22. ();
  23. }
  24. }
  25. public static void main(String[] args) {
  26. }
  27. }

步骤四:添加客户端和服务器端启动的代码 

在Client类的main方法中调用该类的start方法、在Server类的main方法中调用该类start方法。

Client类代码如下所示:

  1. import ;
  2. import ;
  3. import ;
  4. public class Client {
  5. private void start() {
  6. try{
  7. DatagramSocket client = new DatagramSocket();
  8. String sendStr = "Hello! I m Client";
  9. byte[] sendBuf;
  10. sendBuf = ();
  11. InetAddress addr = ("127.0.0.1");
  12. int port = 8088;
  13. DatagramPacket sendPacket = new DatagramPacket(sendBuf,,addr,port);
  14. (sendPacket);
  15. byte[] recvBuf = new Byte[100];
  16. DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
  17. (recvPacket);
  18. String recvStr = new String((), 0, ());
  19. ("服务端说:" + recvStr);
  20. ();
  21. } catch (Exception e) {
  22. ();
  23. }
  24. }
  25. public static void main(String[] args) {
  26. Client client = new Client();
  27. ();
  28. }
  29. }

Server类代码如下所示:

  1. import ;
  2. import ;
  3. import ;
  4. public class Server {
  5. public void start() {
  6. try{
  7. DatagramSocket server = new DatagramSocket(8088);
  8. byte[] recvBuf = new byte[100];
  9. DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
  10. (recvPacket);
  11. String recvStr = new String((), 0, ());
  12. ("客户端说:" + recvStr);
  13. int port = ();
  14. InetAddress addr = ();
  15. String sendStr = " Hello ! I m Server");
  16. byte[] sendBuf;
  17. sendBuf = ();
  18. DatagramPacket sendPacket = new DatagramPacket(sendBuf,, addr, port);
  19. (sendPacket);
  20. ();
  21. } catch (Exception e) {
  22. ();
  23. }
  24. }
  25. public static void main(String[] args) {
  26. Server server = new Server();
  27. ();
  28. }
  29. }

 步骤五:测试

测试客户端和服务器端是否通信成功。首先,启动服务器端;然后再启动客户端。

客户端控制台运行输出如下:

服务器端说:Hello !I m Server

服务器端控制台运行输出如下:

客户端说:Hello I m Client