介绍UDP通信协议的编程之前,先介绍一下网络编程,socket相关的概念:

网络编程:网络编程主要用于解决计算机与计算机(手机平板等)之间的数据传输问题。

网络编程:不需要基于html网页就可以达到数据之间的传输。比如,飞秋,QQ,微信等等

网页编程:基于html页面的基础上进行数据的交互与传输。比如说淘宝,oa(办公自动化)等

计算机网络:分布在不同地域的计算机通过外部设备相互连接起来达到了消息互通,资源共享的效果,这就叫做计算机网络、

网络通讯的三要素:

1、IP,计算机在网络中唯一的身份标识

2、端口号:用于表明该消息是给那个应用程序处理的,只不过是一个标识符而已。

3、协议:一种规范,保障硬件间的良好兼容

IP地址:ip地址的本质就是一个有32位的二进制数组成的数据。

00000000-00000000-00000000-00000000  为了便于记忆,每8bit(1Byte)转换成一个十进制的数,0-255

IP地址是 由网络号+主机号 组成的。子网掩码位数,就是网络号的位数

IP地址的分类

A类地址:1个网络号 + 3个主机号  2^24 政府单位使用

B类地址:2个网络号 + 2个主机号  2^16 事业单位使用

C类地址:3个网络号 + 1个主机号  2^ 8 私人使用

Java中的IP类:InetAddress

常用的方法:

getLocalHost() 获取本机的ip地址 对象. ——静态方法

getByName("IP或者主机名")根据主机名或者一个ip地址的字符串形式,生成一个一片地址《对象》(获取别人的主机地址)

getHostAddress() 返回一个本机的ip地址字符串的形式

getHostName() 返回计算机的主机名

InetAddress.getAllByName("ip地址、主机名、域名") 返回一个InetAddress[]

InetAddress[] arr =  InetAddress.getAllByName("www.baidu.com");

for (InetAddress inetAddress : arr)

{

System.out.println(inetAddress.getHostAddress());

}

上面的getAllByName("www.baidu.com")你可以发现输出的是两台主机,并不是一台主机有两个ip地址的问题。www.baidu.com是一个域名,这个域名需要有ISR供应商的dns服务器进行解析,一般百度之类的大公司,在ISR那注册的服务器都不知一个,白的就是上面两个,这两个服务器的作用主要就是为了实现转发的功能在这两个服务器的后面可能还有大批的服务器集群。

端口号:是没有用来描述的,端口号只相当于一个标识而已。

端口号的范围0-65535之间。

端口号不是对标指定的,有一下的分类:其中后两类基本上都能使用

公认端口(WellKnownPorts):从0到1023,它们紧密绑定(binding)于一些服务。

注册端口(RegisteredPorts):从1024到49151。它们松散地绑定于一些服务。

动态和/或私有端口(Dynamicand/orPrivatePorts):从49152到65535。

常用端口:

21    FTP

80    HTTP

443  HTTPS

网络通信的协议:

UDP通信协议

TCP通信协议

在Java中网络通讯也称之为Socket(套接字,插座)通信,要求通信的两端都要安装Socket。

不同的协议就有不同的插座(Socket)

UDP通信协议

的特点

1、将数据极其源和目的封装为数据包,面向无连接。

2、每个数据包大小限制在64K中

3、因为无连接,所以不可靠,有可能出现数据包丢失的情况

4、因为不需要建立连接,所以速度快

5、udp通信部分服务端与客户端,只分发送端与接收端

如:人说话、对讲机、飞秋、凌波、CS枪战游戏等

udp协议下的Socket:

DatagramSocket(udp插座服务):发送与接收都是用该类

DatagramPacket(数据包类)

DatagramPacket(buf, length, address, port)

buf发送的内容

length发送内容的大小

address发送的目的地ip地址对象

port是一个端口号

发送端的使用步骤:

1、建立udp的服务

2、准备数据,把数据封装到数据包中发送

3、发送端的数据包要带上一个ip地址与端口号。

3、调用udp的服务发送数据。

4、关闭资源

 //发送端 完全模拟码头发货的过程
public class Demo1Sender
{
public static void main(String[] args) throws IOException
{
//建立udp的服务
DatagramSocket datagramSocket = new DatagramSocket();//直接使用午餐构造方法就行了
//准备数据,把数据封装到发送包中
String data = "这是一个udp的例子...";
DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090);
//调用udp的服务发送数据包
datagramSocket.send(datagramPacket);
//关闭资源---实际上就是释放占用的端口号
datagramSocket.close();
}
}

接收端的使用步骤

1、建立udp的服务。

2、准备空的数据包,接受数据。(只要制定一个字节数组)

3、调用udp的服务接受数据。

4、关闭资源。

 //接收端
public class Demo1Recieve
{
public static void main(String[] args) throws IOException
{
//建立udp插座服务,监听一个端口
DatagramSocket datagramSocket = new DatagramSocket(9090);
//准备空的数据包用于存储数据
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
//调用udp的服务接受数据
datagramSocket.receive(datagramPacket); //数据实际上存储到了 buf 字节数组中.recieve方法是一个阻塞方法,没有接收到数据就会一直处于阻塞状态。 System.out.println("接收端接受到的数据:"+new String(buf, 0, datagramPacket.getLength()));//getLength()获取数据包存储的字节,到底接受了多少字节,datagramPacket最清楚 //关闭资源
datagramSocket.close();
}
}

很明显运行上面的示例程序的时候,应当先启动接收端的,接收端处于一种等待接收信息的阻塞状态。然后在运行发送端的,发送端运行,发出数据,接收端接受数据之后,程序接受。

群聊示例,关键是接收端发送端一定要使用多线程,发送端的消息数据包中的地址应

 当是广播地址。
发送端:
public class ChatSender extends Thread
{
@Override
public void run()
{
//建立udp的服务
try
{
DatagramSocket socket = new DatagramSocket(); //发送端不需要地址
//准备数据,把数据封装到数据包中
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
DatagramPacket packet = null;
while((line = keyReader.readLine())!=null)
{
//把数据封装到数据包中,发送出去
packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.1.255"), 9090);
//把数据包发送出去
socket.send(packet);
}
//关闭资源
socket.close();
} catch (SocketException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
接收端:
//群聊的接收端
public class ChatRecieve extends Thread
{
@Override
public void run()
{
try
{
//建立udp的服务,接收端要监听一个端口
DatagramSocket socket = new DatagramSocket(9090);
//准备一个空的集装箱
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
boolean flag = true;
while(flag)
{
socket.receive(packet);
//packet.getAddress()获取发送数据包的IP地址对象
System.out.println(packet.getAddress().getHostAddress()+"说:"+new String(buf, 0, packet.getLength()));
}
//关闭资源
socket.close();
} catch (SocketException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//主程序
public class ChatMain
{
public static void main(String[] args)
{
ChatRecieve chatRecieve = new ChatRecieve();
chatRecieve.start(); ChatSender chatSender = new ChatSender();
chatSender.start();
}
}
启动主程序即可。

(28)网络编程之UDP的更多相关文章

  1. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

  2. Java网络编程之UDP

    Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...

  3. java网络编程之UDP通讯

    详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...

  4. day33 网络编程之UDP与进程了解

    UDP 什么是UDP协议 在上节课的练习中,使用TCP进行网络编程时,我们会遇到粘包问题,这是因为TCP是流式协议,而今天学习的UDP协议不是流式协议,其发送的数据是数据报格式的,在进行数据发送时该协 ...

  5. 网络编程之UDP中一个包的大小最大能多大

    读书笔记:here 结论1:局域网环境下,建议将UDP数据控制在1472字节以下 一定要知道 因为链路层的传输单元(MTU)是1500字节,1500字节中并不包含链路层的首尾18个字节.1500字节是 ...

  6. java 25 - 4 网络编程之 UDP协议传输的代码优化

    UDP协议的输出端: /* UDP发送数据: A:创建Socket发送端对象 B:创建数据报包(把数据打包) C:调用Socket对象发送数据报包 D:释放资源(底层是IO流) */ public c ...

  7. java 25 - 4 网络编程之 UDP协议传输思路

    UDP传输 两个类:DatagramSocket与DatagramPacket(具体看API) A:建立发送端,接收端. B:建立数据包. C:调用Socket的发送接收方法. D:关闭Socket. ...

  8. Java:网络编程之UDP的使用

    java.net  类 DatagramSocket 此类表示用来发送和接收数据报包的套接字,数据报套接字是包投递服务的发送或接收点. java.net  类 DatagramPacket 此类表示数 ...

  9. 网络编程之UDP协议

    UDP协议 UDP(User Datagram Protocol)也就是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范. 提 ...

随机推荐

  1. MEAN教程1-MongoDB安装和使用

    MEAN是MongoDB.Express.AngularJS和Node.js的缩写.其理念是仅使用JavaScript一种语言来驱动整个应用.其最鲜明的特点有以下几个:1整个应用只使用一种语言:2整个 ...

  2. Swift 2.2 协议和代理

    一:代理 两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate). 比如:控制器(Controller)与控制器(Controller)之间 ...

  3. 微信公众号平台接口开发:基础支持,获取微信服务器IP地址

    官方说明 目前看不出来这个接口有哪些具体运用,但是既然有这个接口,那我们就试试能不能用 访问接口 修改WeCharBase.cs,新增以下2个方法 public static string Serve ...

  4. SpringMVC总结的部分教程及使用方法

    注:本文只用注解来实现 SpringMVC各种流程图流程图(其他的各种流程图)jsp.xml.action彼此之间的关系,都如何使用spring-mvc.xml如何配置,放在哪里?action中如何转 ...

  5. jQuery validata插件实现(每周一插件系列)

    大家好,第一次写有点正规的博客,以前都是随手复制几下.为了打LOL,我写快点,代码我都复制在最下面了,并且写了大量的注释. 首先我写jquery插件,喜欢这么写(好处有很多,以后在讲,哈哈,看过jQu ...

  6. 微信小程序 网络请求之re.request 和那些坑

    微信小程序有四种网络请求类型,下面只详细介绍普通HTTPS请求(wx.request) 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downlo ...

  7. iOS 图形编程总结

    iOS实现图形编程可以使用三种API(UIKIT.Core Graphics.OpenGL ES及GLKit). 这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘 ...

  8. 在ZendStudio中增加新的php模板

    步骤: 找到目录:D:\Program Files\Zend\Zend Studio 12.5.1\plugins , 这要根据自己的安装情况来找,再找到以下文件org.eclipse.php.ui_ ...

  9. 微信群之Java技术红包问答

    缘起 年前公司拿到B+轮融资,相应的在战略上也做了很大的调整,毕竟B轮要做的事情不仅仅是增加用户数,于是乎公司在2017年的开头补充了一部分技术团队,这次人员选择上主要针对一些工作经验在1-2年的技术 ...

  10. 定义 : angular view 和controller 之前的 ng-init 由谁来负责

    在设计view时,会需要default的值,这是会去下ng-init,但是如果发现ng-init没有,这时controller就会有. 概念是当ctrl要用时,就由ctrl负责.