Java之------socket系列(二)UDP

☆ UDP:

将数据及源和目的封装成数据包中,不需要建立连接

每个数据报的大小在限制在64k内

因无连接,是不可靠协议

不需要建立连接,速度快

DatagramSocket和

DatagramPacket类

UDP传输:

DatagramSocket与DatagramPacket

建立发送端,接收端。

建立数据包。

调用Socket的发送接收方法。

关闭Socket。

发送端与接收端是两个独立的运行程序。

UDP传输编程:

☆发送端

在发送端,要在数据包对象中明确目的地IP及端口。

DatagramSocket ds = new DatagramSocket();
byte[] by = “hello,udp”.getBytes();
DatagramPacket dp = new DatagramPacket(by,0,by.length,
	InetAddress.getByName(“127.0.0.1”),10000);
ds.send(dp);
ds.close();

☆接收端

在接收端,要指定监听的端口。

DatagramSocket ds = new DatagramSocket(10000);
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
ds.close();

示例:

发送方:

package cn.hncu.url.udp;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class SendDemo {

	public static void main(String[] args) {
		try {
//			send1();//这个方法演示的是发送小数据
			send2();//这个方法演示的是发送较大数据
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void send2() throws Exception {
		//for sending larger packet
		DatagramSocket ds=new DatagramSocket(10000);//这里指定端口号10000,各程序上的端口号都是唯一的,一个程序中要新建多个DatagramSocket需要使用不同的端口号
		InputStream in=new FileInputStream("file.txt");
		BufferedInputStream bis=new BufferedInputStream(in);
		byte buf[]=new byte[1024];
		buf[0]=0;
		int len=0;
		while ((len=bis.read(buf, 1, buf.length-1))!=-1){//这里我把数组第一位留出来作为判断文件是否读取完毕的标记
			if (len<1023){
				buf[0]=1;//文件读取完毕后位置0设为1,这样做是为了接收方的关闭动作,若不这样做的话不管是否读取完接收                                //方会一直开着
			}
			DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("xxx.xxx.xxx.xxx"), 10001);
                        //上一行的ip地址我用xxx.xxx.xxx.xxx表示,运行程序时记得改成你自己的ip地址,下同
			ds.send(dp);
		}
		ds.close();
	}

	private static void send1() throws Exception {
		//for sending less packet
		DatagramSocket ds=new DatagramSocket(10000);
		String str="你知道吗,god is a girl";
		byte buf[]=str.getBytes("utf-8");
		//DatagramPacket类中,有ip地址的构造方法是用来创建发送数据包的
		DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("xxx.xxx.xxx.xxx"),10001);//注意,IP和端口都是接收方的
		ds.send(dp);
		ds.close();
	}
}

接收方:

package cn.hncu.url.udp;

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

public class ReceiveDemo {

	public static void main(String[] args) {
		try {
//			receive1();//接收小数据
			receive2();//接收较大数据
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void receive2() throws Exception {
		//for receiving larger packet
		DatagramSocket ds=new DatagramSocket(10001);
		byte buf[]=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf, buf.length);
		while (true){
			ds.receive(dp);

			//从dp中解析出我们想要的信息
			//获取ip
			byte data[]=dp.getData();
			String info=new String(data,1,data.length-1);
			System.out.println(info);
			if (data[0]==1){
				ds.close();
			}
		}

	}

	private static void receive1() throws Exception {
		//for receiving less packet
		DatagramSocket ds=new DatagramSocket(10001);
		byte buf[]=new byte[1024];
		//DatagramPacket类中,没有ip地址的构造方法是用来创建接收数据包的
		DatagramPacket dp=new DatagramPacket(buf, buf.length);
		ds.receive(dp);

		//从dp中解析出我们想要的信息
		//获取ip
		String ip=dp.getAddress().getHostAddress();
		int port=dp.getPort();
		byte data[]=dp.getData();
		String info=new String(data);
		System.out.println(ip+":"+port+"----"+info);
	}
}
时间: 2024-11-09 05:04:06

Java之------socket系列(二)UDP的相关文章

Java之------socket系列(四)TCP

TCP传输 TCP Socket:IP地址和端口,套接字 Socket和ServerSocket 建立客户端和服务器端 建立连接后,通过Socket中的IO流进行数据的传输 关闭socket 同样,客户端与服务器端是两个独立的应用程序. TCP传输编程 ☆基本思路(客户端) 客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常. 连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过g

深入理解JAVA I/O系列二:字节流详解

流的概念 JAVA程序通过流来完成输入/输出.流是生产或消费信息的抽象,流通过JAVA的输入输出与物理设备链接,尽管与它们链接的物理设备不尽相同,所有流的行为具有相同的方式.这样就意味一个输入流能够抽象多种不同类型的输入:从磁盘文件.从键盘或从网络套接字:同样,一个输出流可以输出到控制台.磁盘文件或相连的网络. 在我们平时接触的输入/输出流中,有这样一个概念必须要弄明白,何谓输入.何谓输出?讨论这个问题的前提是要知道以什么为参考物,这个参考物就是程序或者内存.输入:就是从磁盘文件或者网络等外部的

Java之------socket系列(三)

练习:UDP聊天程序 通过键盘录入获取要发送的信息. 将发送和接收分别封装到两个线程中. 聊天方一: <span style="font-size:14px;">package cn.hncu.url.udp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.

Java设计模式菜鸟系列(二)观察者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577 观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来,当一个对象改变状态时,依赖它的对象都会收到通知并自动跟新.Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体现在Observable类和Observer接口.先看uml模型图: 一.UML模型图 二.代码实现 /** 示例:咱们去菜市场买菜 * * 小商

Java之------socket系列(一)

网络编程 相关基础概念: 1.计算机网络与Internet 2.TCP/IP协议 3.Internet地址 IP地址,形如xxx.xxx.xxx.xxx 域名系统.例如www.edu.cn URL(统一资源定位符) 协议 :// 主机 [: 端口] [/ 文件] [# 引用] 客户-服务器(Client-Server)模式 网络模型与通讯要素: 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 ☆七层简述: 1.物理层:主要定义物理设备标准,如网线的接口类

Java设计模式菜鸟系列(二十一)享元模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40021651 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象.主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销.在某种程度上,你可以把单例看成是享元的一种特例. 一.uml建模: 二.代码实现 /** * 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象. * * 主要目的是实现对象的共享,即共享池,当系统中对象

Java设计模式菜鸟系列(二十二)中介者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40027109 中介者模式(Mediator):主要用来降低类与类之间的耦合的,因为如果类与类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改. 一.uml建模: 二.代码实现 /** * 中介者模式(Mediator):主要用来降低类与类之间的耦合的,因为如果类与类之间有依赖关系的话, * * 不利于功能的拓展和维护,因为只要修改一个对象,其它

Java设计模式菜鸟系列(二十三)访问者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40028509 访问者模式(Visitor):把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定而算法又容易变化的系统.访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者:而它的缺点就是增加新的数据结构很困难. 一.uml建模: 二.代码实现 /** * 访问者模式(Visitor):把数据结构和作用于结构上的操作解耦合,使

Java设计模式菜鸟系列(二十)解释器模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40019829 解释器模式(Interpreter):它定义了对象与对象之间进行某种操作之后会得到什么值.一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄. 一.uml建模: 二.代码实现 /** * 解释器模式(Interpreter):它定义了对象与对象之间进行某种操作之后会得到什么值. * * 一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄. * * 示例: