介绍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. Swiper --移动端触摸滑动插件

    Swiper使用方法 1.首先加载插件,需要用到的文件有swiper.min.js和swiper.min.css文件. <!DOCTYPE html> <html> <h ...

  2. 笑谈ArcToolbox (3) ArcToolbox的一亩三分地

    笑谈ArcToolbox (3) ArcToolbox的一亩三分地 by 李远祥 每个人都会有一些鲜为人知的小秘密,都有着不允许别人染指的一亩三分地.软件是人编写的,当然也会给它留有自己所拥有的一亩三 ...

  3. Apache常见功能实战详解

    Apache 是一款使用量排名第一的 web 服务器,LAMP 中的 A 指的就是它.由于其开源.稳定.安全等特性而被广泛使用.前边的一篇文章中已经记录过如何搭建 LAMP 架构,搭建仅是第一步,其中 ...

  4. AJSX 传输数组

    如果要利用ajax传输数组,或者传输多个(不知道有多少个)class的某一属性的值,例如: 要将这三个数据传入php编辑界面,图片显示有三个数据,但实际上,数据的多少是由数据库所导出的数据 决定的.如 ...

  5. SVM入门(一)

    近来,了解了一下SVM(支持向量机 support vector machine)的原理.顺便把自己理解的内容整理一下. 不讲背景啦,直接切入主题.     一.什么是支持向量机 好比说,我们现在在一 ...

  6. ACM入门:第s名的小红

    前几天的大一新生赛自己也跟着做了做,顺便测测后台数据有没有bug,这是一道排序题,题目如下: Problem Description 小红总是排第二,有点不服气,现在她想知道一个序列中第二小的数字是多 ...

  7. 解决CSS中float:left后需要clear:both清空

    现在,大部分的横排导航都是通过 ul -> li *n -> a 来实现的.具我所知,要达到这种效果,有几种方法可以实现. 1.传统处理方式: li {float:left;}/*这样,对 ...

  8. TJOI2015 day2解题报告

    TJOI2015终于写完啦~~~ T1:[TJOI2015]旅游 描述:(BZ没题面只能口述了..)一个人在一棵树上走,每次从a->b会进行一次贸易(也就是在这条路径上买入物品然后在后面卖出)然 ...

  9. 【2017年新篇章】 .NET 面试题汇总(二)

    本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇 第一篇文章请到这里:[2017年新篇章] .NET 面试题汇总(一) 简介 此次包含的不止是.NET知识,也包含少许前端知识以及.ne ...

  10. canvas绘图不清晰的解决方案

    现象描述 同样大小的图片(60x60px)用canvas和DOM绘制,结果发现canvas的画面质量要差很多.结果如下图所示. 上图中,左侧红框中的金币采用DOM绘制,右侧和下方的金币和文字等使用ca ...