基于UDP协议的Socket编程——使用Socket编程实现客户咨询

利用UDP通信的两个端点是平等的,也就是说通信的两个程序关系是对等的,没有主次之分,甚至它们的代码都可以完全一致,这一点要与基于TCP协议的Socket编程区分开来。

步骤:

1、利用DatagramPacket对象封装数据包。

2、利用DatagramSocket对象发送数据包。

3、利用DatagramSocket对象接收数据包。

4、利用DatagramPacket对象处理数据包。

 

模拟客户咨询的功能,实现:发送方发送咨询问题,接收方接收显示发送来的咨询问题。

发送方实现步骤:

1、获取本地主机的InetAddress对象。

2、创建DatagramPacket对象,封装要发送的信息。

3、用DatagramSocket对象将DatagramPacket对象数据发送出去。

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

public class Sender {
	public static void main(String[] args) {
		try {
			// 获取本地主机地址
			InetAddress ia = InetAddress.getLocalHost();

			Scanner can = new Scanner(System.in);

			// 创建DatagramSocket对象,向接收方发送数据
			DatagramSocket ds;

			while (true) {
				System.out.println("请输入要咨询的问题:");
				String str = can.nextLine();
				// 创建DatagramPacket对象,封装数据
				DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, ia, 6000);
				ds = new DatagramSocket();
				ds.send(dp);
			}
			// 关闭DatagramSocket对象
			// ds.close();

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

接收方实现步骤:

1、创建DatagramPacket对象,准备接收封装的数据。

2、创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。

3、利用DatagramPacket对象处理数据。

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

public class Receiver {
	public static void main(String[] args) {
		try {
			// 创建DatagramPacket对象,用来准备接收数据
			DatagramSocket ds = new DatagramSocket(6000);

			System.out.println("接收方已打开!");
			while (true) {
				// 接收数据
				byte[] b = new byte[1024];
				DatagramPacket dp = new DatagramPacket(b, b.length);
				ds.receive(dp);
				// 显示接收到的信息
				String str = new String(dp.getData(), 0, dp.getData().length);
				System.out.println(dp.getAddress().getHostAddress() + "发送的数据为:" + str);

			}
			// ds.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}
//Sender发送消息
请输入要咨询的问题:
我是谁?
请输入要咨询的问题:
你是谁?
请输入要咨询的问题:
我在干嘛?
请输入要咨询的问题:

//Receiver结果
接收方已打开!
192.168.199.153发送的数据为:我是谁?
192.168.199.153发送的数据为:你是谁?
192.168.199.153发送的数据为:我在干嘛?

<<<<=======升级=======>>>>接收方接收到发送方发送的消息之后,给发送方一个回应

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

public class ReceiverAndSender {
	public static void main(String[] args) {
		try {
			// 创建DatagramPacket对象,用来准备接收数据
			DatagramSocket ds = new DatagramSocket(6000);

			System.out.println("接收方已打开!");
			// 接收数据
			byte[] b = new byte[1024];
			DatagramPacket dp = new DatagramPacket(b, b.length);
			ds.receive(dp);
			// 显示接收到的信息
			String str = new String(dp.getData(), 0, dp.getData().length);
			System.out.println(dp.getAddress().getHostAddress() + "发送的数据为:" + str);

			ds.close();

			// 发送回应
			// 获取本地主机地址
			InetAddress ia = InetAddress.getLocalHost();

			Scanner can = new Scanner(System.in);

			// 创建DatagramSocket对象,向接收方发送数据
			DatagramSocket ds2;

			System.out.println("请输入你的回应:");
			String str2 = can.nextLine();
			// 创建DatagramPacket对象,封装数据
			DatagramPacket dp2 = new DatagramPacket(str2.getBytes(), str2.getBytes().length, ia, 6001);
			ds2 = new DatagramSocket();
			ds2.send(dp2);

			// 关闭DatagramSocket对象
			ds2.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

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

public class SenderAndReceiver {
	public static void main(String[] args) {
		try {
			// 获取本地主机地址
			InetAddress ia = InetAddress.getLocalHost();

			Scanner can = new Scanner(System.in);

			System.out.println("请输入要咨询的问题:");
			String str = can.nextLine();

			// 创建DatagramPacket对象,封装数据
			DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, ia, 6000);

			// 创建DatagramSocket对象,向接收方发送数据
			DatagramSocket ds = new DatagramSocket();
			ds.send(dp);

			// 关闭DatagramSocket对象
			ds.close();

			// 接收数据
			byte[] b = new byte[1024];
			DatagramPacket dp2 = new DatagramPacket(b, b.length);

			// 准备接收回应
			DatagramSocket ds2 = new DatagramSocket(6001);
			ds2.receive(dp2);

			System.out.println("对方已回答:");
			// 显示接收到的信息
			String str2 = new String(dp2.getData(), 0, dp2.getData().length);
			System.out.println(dp2.getAddress().getHostAddress() + "的回答:" + str2);

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
请输入要咨询的问题:
我是谁?
对方已回答:
192.168.199.153的回答:你是你啊~

接收方已打开!
192.168.199.153发送的数据为:我是谁?
请输入你的回应:
你是你啊~

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值