`

基于UDP协议的数据交互例子

 
阅读更多
直接贴上代码:
客户端:
package com.example;

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

public class UdpClient {

	/** 定义发送数据报的目的地. */
	public static final int DEST_PORT = 30000;

	public static final String DEST_IP = "127.0.0.1";

	/** 定义每个数据报的最大大小为4K */
	private static final int DATA_LEN = 4096;

	/** 定义该客户端使用的DatagramSocket,它的唯一作用就是接收和发送数据 
               报. */
	private DatagramSocket mSocket = null;

	/** 定义接收网络数据的字节数组 */
	byte[] inBuff = new byte[DATA_LEN];

	/** 以指定字节数组创建准备接受数据的DatagramPacket对象. Java使用
               DatagramPacket来代表数据报. */
	private DatagramPacket inPacket = new DatagramPacket(inBuff, 
             inBuff.length);

	/** 定义一个用于发送的DatagramPacket对象 */
	private DatagramPacket outPacket = null;

	public void init() throws IOException {
		try {
			/**
			 * DatagramSocket():
			 * <p>
			 * 创建一个DatagramSocket实例,并将该对象绑定到
                                    本机默认IP地址、本机所有可用端口中随机选择的
                                    某个端口。
			 * <p>
			 * DatagramSocket(int prot):
			 * <p>
			 * 创建一个DatagramSocket实例,并将该对象绑定到
                                   本机默认IP地址、指定端口。
			 * <p>
			 * DatagramSocket(int port, InetAddress 
                               laddr):
			 * <p>
			 * 创建一个DatagramSocket实例,并将该对象绑定到
                                    指定IP地址、指定端口。
			 */
			mSocket = new DatagramSocket();

			/** 初始化发送用的DatagramSocket,它包含一个长度
                                     为0的字节数组. */
			outPacket = new DatagramPacket(new byte[0], 0, InetAddress.getByName(DEST_IP), DEST_PORT);

			/** 创建键盘输入流. */
			Scanner scan = new Scanner(System.in);

			/** 不断读取键盘输入. */
			while (scan.hasNextLine()) {

				/** 将键盘输入的一行字符串转换字节数组 */
				byte[] buff = scan.nextLine().getBytes();

				/** 设置发送用的DatagramPacket里的字节数据 */
				outPacket.setData(buff);

				/** 发送数据报 */
				mSocket.send(outPacket);

				/** 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里. */
				mSocket.receive(inPacket);

				System.out.println(new String(inBuff, 0, inPacket.getLength()));
			}
		}
		/** 使用finally块保证关闭资源. */
		finally {
			if (mSocket != null) {
				mSocket.close();
			}
		}
	}

	public static void main(String[] args) throws IOException {
		new UdpClient().init();
	}
}



服务器端:
package com.example;

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

public class UdpServer {

	public static final int PORT = 30000;

	/** 定义每个数据报的最大大小为4K. */
	private static final int DATA_LEN = 4096;

	/** 定义该服务器使用的DatagramSocket. */
	private DatagramSocket socket = null;

	/** 定义接收网络数据的字节数组. */
	byte[] inBuff = new byte[DATA_LEN];

	/** 以指定字节数组创建准备接受数据的DatagramPacket对象. */
	private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);

	/** 定义一个用于发送的DatagramPacket对象. */
	private DatagramPacket outPacket;

	/** 定义一个字符串数组,服务器发送该数组的的元素. */
	String[] books = new String[] { "轻量级J2EE企业应用实战", "基于J2EE的Ajax宝典", "Struts2权威指南", "ROR敏捷开发最佳实践" };

	public void init() throws IOException {
		try {
			/** 创建DatagramSocket对象. */
			socket = new DatagramSocket(PORT);

			/** 采用循环接受数据. */
			for (int i = 0; i < 10; i++) {
				/** 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里. */
				socket.receive(inPacket);

				/** 判断inPacket.getData()和inBuff是否是同一个数组. */
				System.out.println(inBuff == inPacket.getData());

				/** 将接收到的内容转成字符串后输出. */
				System.out.println(new String(inBuff, 0, inPacket.getLength()));

				/** 从字符串数组中取出一个元素作为发送的数据. */
				byte[] sendData = books[i % 4].getBytes();

				/**
				 * 以指定字节数组作为发送数据、以刚接受到的DatagramPacket的源
				 * <p>
				 * SocketAddress作为目标SocketAddress创建DatagramPacket.
				 */
				outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getSocketAddress());

				/** 发送数据. */
				socket.send(outPacket);
			}
		}
		/** 使用finally块保证关闭资源. */
		finally {
			if (socket != null) {
				socket.close();
			}
		}
	}

	public static void main(String[] args) throws IOException {
		new UdpServer().init();
	}
}



    最后说一句:此时服务器端的循环只有10次,在接受了10次数据后,Server端就不能接受到数据了.这个要注意一下.更详细点得描述,可以浏览这个地址:
     http://hxdawxyhxdawxy.iteye.com/blog/1291266

总结一下:
    客户端与服务器端的唯一区别在于:服务器所在IP地址、端口是固定的,所以客户端可以直接将该数据报发送给服务器,而服务器则需要根据接收到的数据报来决定将"反馈"数据报的目的地.
分享到:
评论

相关推荐

    linux网络编程-宋敬彬-part1

    目 录 第1篇 Linux网络开发基础 第1章 Linux操作系统概述 2 1.1 Linux发展历史 2 1.1.1 Linux的诞生和发展 2 ...第10章 基于UDP协议的接收和发送 267 10.1 UDP编程框架 267 10.1.1 UDP编程框图 267

    Visual.Basic.6大学教程.pdf

    19.8 Winsock控件和基于UDP的客户/服务器计算 631 19.8.1 一个简单的基于UDP的服务器 632 19.8.2 一个简单的基于UDP的客户 633 19.8.3 客户/服务器交互的输出 635 19.9 Winsock 控件的其他属性、方法和事件 636 ...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    vc++ 应用源码包_1

    独立打包,保证可解压,内含大量源码,网上搜集而来。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下...vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框出现气球提示 调用系统自带...

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    由于oSIP是比较底层的SIP协议栈实现,新手较难上手,而官方的示例大都是一些伪代码,需要有实际的例子程序参考学习,而最好的例子就是同样官方发布的oSIP的扩展开发库exosip2,使用exoSIP可以很...

    vc++ 应用源码包_2

    独立打包,保证可解压,内含大量源码,网上搜集而来。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种...vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框出现气球提示 调用系统...

    vc++ 应用源码包_6

    独立打包,保证可解压,内含大量源码,网上搜集而来。一共10几包,每个包几十兆。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏...vc基于HTTP协议断点续传和多线程下载源代码 VC...

    vc++ 应用源码包_5

    独立打包,保证可解压,内含大量源码,网上搜集而来。一共10几包,每个包几十兆。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏...vc基于HTTP协议断点续传和多线程下载源代码 VC...

    vc++ 应用源码包_3

    独立打包,保证可解压,内含大量源码,网上搜集而来。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏...vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框...

    vc++ 开发实例源码包

    目前的协议有如下一些特点: 1) 客户向服务器发送请求, 每个请求的长度不定. 请求的长度在第一个INT中指定. 2) 每个服务器通常会向多种客户提供服务, 例如, TS要同时向CP, NP提供服务, CP要向NP和其他CP提供服务, ...

    RED HAT LINUX 6大全

    11.6.2 DNS区数据文件 212 11.7 配置DNS服务器主域 215 11.7.1 添加本地域解析 215 11.7.2 添加虚拟域解析 217 11.8 授权委托 218 11.8.1 在sylvia上添加 subdomain. domain.cxm的授权 218 11.8.2 测试subdomain....

    疯狂JAVA讲义

    第9章 与运行环境交互 314 9.1 与用户互动 315 9.1.1 运行Java程序的参数 315 9.1.2 使用Scanner获取键盘输入 316 9.1.3 使用BufferedReader获取键盘输入 318 9.2 系统相关 319 9.2.1 System类 319 9.2.2 ...

    JAVA程序设计教程

    §2.1 数据类型概述 ........................................................................................................14 2.1.1 什么是类型? .....................................................

Global site tag (gtag.js) - Google Analytics