介绍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. Mac系统安装Aircrack-ng破解wifi密码(2)

    我们上一篇文章说过如何通过Aircrack-ng, 破解使用WPA/PSK加密方式的路由密码, 这一篇介绍的是使用Aircrack-ng破解使用WEP加密方式的路由密码: WEP和WPA/PSK的区别 ...

  2. 《JAVASCRIPT高级程序设计》DOM扩展

    虽然DOM为XML及HTML文档交互制定了一系列的API,但仍然有几个规范对标准的DOM进行了扩展.这些扩展中,有很多是浏览器专有的,但后来成了事实标准,于是其他浏览器也提供了相同的实现:浏览器开发商 ...

  3. [html] 学习笔记-Canvas使用路径

    想要绘制其他图形,需要使用路径,使用路径包含4个步骤,开始创建路径.创建图形的路径.路径创建完成后关闭路径.设定绘制样式,之后就可以调用绘制方法绘制路径了. 1.绘制圆形 <!DOCTYPE h ...

  4. ubuntu16.04无法设置选择wifi的解决办法

    在公司上班一直连接的有线,直到昨天拿回家才发现ubuntu无法选择使用wifi上网,这让人非常无奈,截图类似如下: 而正常情况下我们应该在启用联网的下面有wifi链接的选项,如图: 我隐约猜测是和驱动 ...

  5. linux c语言定时器

    原文来自于:http://hi.baidu.com/opetrhsxszbckzd/item/126966cae5f9524aa9ba94f5 我只是把其重新排版标注一下. linux c语言定时器 ...

  6. react构建淘票票webapp,及react与vue的简单比较。

    前言 前段时间使用vue2.0构建了淘票票页面,并写了一篇相关文章vue2.0构建淘票票webapp,得到了很多童鞋的支持,因此这些天又使用react重构了下这个项目,目的无他,只为了学习和共同进步! ...

  7. 二维码 iOS

    一:生成二维码 1.根据一个字符串生成一个二维码  根据 #import <CoreImage/CoreImage.h>这个框架写的 在按钮的点击事件写 @interface ViewCo ...

  8. $.each()遍历json数据

    var json = [ {"id":"1","tagName":"apple"}, {"id":& ...

  9. 决策树和基于决策树的集成方法(DT,RF,GBDT,XGB)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 内容: 1.算法概述 1.1 决策树(DT)是一种基本的分类和回归方法.在分类问题中它可以认为是if-the ...

  10. BZOJ 1050: [HAOI2006]旅行comf (并查集 或 单调队列)

    这是建空间后做的第一道题啊= =好水 排序,枚举最小边,然后并查集求出联通时的最大边 或者排次序,从小到大插边,如果插边时最小的边拿掉不会使s与t不联通,就删去。 code: #include< ...