基于UDP实现简单的客户端服务端的消息传递


前面的TCP是有可靠的,有序的。现在看看UDP,UDP是不可靠的,无序的。


现在看看实现:
这里我也用两个类模拟了客户端与服务端,

现在直接看下代码:


UDPServer.java:

package com.socket.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 * UDP 服务端
 * 
 * @author lolli
 *
 */
public class UDPServer {
	public static void main(String[] args) {
		try {
			// 创建服务器端的DatagramSocket,并指定端口
			DatagramSocket datagramSocket = new DatagramSocket(8888);
			System.out.println("*****  启动服务器,等待客户端的连接请求  ******");
			byte[] data = new byte[2048];
			// 创建数据报,用户接受客户端请求的数据
			DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
			// 接收客户端请求的数据(在接收到数据之前一直处于阻塞状态)
			datagramSocket.receive(datagramPacket);
			// 获取请求的数据,并转成String打印出来
			String clientData = new String(data, 0, datagramPacket.getLength());
			System.out.println("我是服务端,客户端请求的数据为:" + clientData);

			
			//  *** 给客户端进行相应 ***
			
			// 定义客户端的地址
			InetAddress inetAddress = datagramPacket.getAddress();
			int port = datagramPacket.getPort();
			byte[] backData = "我接受到了客户端的数据,你好!".getBytes();
			// 创建数据包,给客户端响应数据
			DatagramPacket backDatagramPacket = new DatagramPacket(backData, backData.length, inetAddress, port);
			// 给客户端发送数据
			datagramSocket.send(backDatagramPacket);
					
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

再看看客户端:

UDPClient.java:

package com.socket.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 * UDP 客户端
 * @author lolli
 *
 */
public class UDPClient {

	public static void main(String[] args) {
		
		try {
			// 定义服务器地址
			InetAddress inetAddress = InetAddress.getByName("localhost");
			byte[] data = "我是客户端,hello".getBytes();
			// 创建数据报,准备数据
			DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 8888);
			// 创建一个DatagramSocket
			DatagramSocket datagramSocket = new DatagramSocket();
			// 发送请求
			datagramSocket.send(datagramPacket);
			
			
			// *** 接收服务端响应回来的数据 ***
			
			byte[] resData = new byte[2048];
			// 创建数据报,用户接受客户端请求的数据
			DatagramPacket resDatagramPacket = new DatagramPacket(resData, resData.length);
			// 接收客户端请求的数据(在接收到数据之前一直处于阻塞状态)
			datagramSocket.receive(resDatagramPacket);
			// 获取请求的数据,并转成String打印出来
			String serverData = new String(resData, 0, resDatagramPacket.getLength());
			System.out.println("我是客户端,服务端响应的数据为:" + serverData);
			
			
			datagramSocket.close();
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


然后再运行看看结果。

同样的,我们也要先启动客户端,在启动客户端

服务端控制台:


客户端控制台:






  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值