(28)网络编程之UDP
介绍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的更多相关文章
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
- Java网络编程之UDP
Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...
- java网络编程之UDP通讯
详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...
- day33 网络编程之UDP与进程了解
UDP 什么是UDP协议 在上节课的练习中,使用TCP进行网络编程时,我们会遇到粘包问题,这是因为TCP是流式协议,而今天学习的UDP协议不是流式协议,其发送的数据是数据报格式的,在进行数据发送时该协 ...
- 网络编程之UDP中一个包的大小最大能多大
读书笔记:here 结论1:局域网环境下,建议将UDP数据控制在1472字节以下 一定要知道 因为链路层的传输单元(MTU)是1500字节,1500字节中并不包含链路层的首尾18个字节.1500字节是 ...
- java 25 - 4 网络编程之 UDP协议传输的代码优化
UDP协议的输出端: /* UDP发送数据: A:创建Socket发送端对象 B:创建数据报包(把数据打包) C:调用Socket对象发送数据报包 D:释放资源(底层是IO流) */ public c ...
- java 25 - 4 网络编程之 UDP协议传输思路
UDP传输 两个类:DatagramSocket与DatagramPacket(具体看API) A:建立发送端,接收端. B:建立数据包. C:调用Socket的发送接收方法. D:关闭Socket. ...
- Java:网络编程之UDP的使用
java.net 类 DatagramSocket 此类表示用来发送和接收数据报包的套接字,数据报套接字是包投递服务的发送或接收点. java.net 类 DatagramPacket 此类表示数 ...
- 网络编程之UDP协议
UDP协议 UDP(User Datagram Protocol)也就是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范. 提 ...
随机推荐
- 2017年试试Web组件化框架Omi
Open and modern framework for building user interfaces. Omi的Github地址https://github.com/AlloyTeam/omi ...
- 判断数据是否服从某一分布(二)——简单易用fitdistrplus包
一.对数据的分布进行初步判断 1.1 原理 对于不同的分布,有特定的偏度(skewness)和峰度(kurtosis),正态分布.均匀分布.逻辑斯谛分布.指数分布的偏度和峰度都是特定的值,在偏 ...
- 关于下载SAE日志签名认证的方法——PHP版
之前需要下载SAE上的日志存入数据库,因此研究了下SAE的签名认证和日志下载.这个链接是SAE官方给出的API文档.https://www.sinacloud.com/doc/api.html#qia ...
- 跟着内核学框架-从misc子系统到3+2+1设备识别驱动框架
misc子系统在Linux中是一个非常简单的子系统,但是其清晰的框架结构非常适合用来研究设备识别模型.本文从misc子系统的使用出发,通过了解其机制来总结一套的设备识别的驱动框架,即使用使用同一个驱动 ...
- vue路由表(简单)
import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter) const first = { template: ...
- android学习9——Handler简单用法
Handler用来发消息和处理消息.典型的用法是更新界面.android不允许在子线程里面更新界面,通常是把Handler传到子线程中,在子线程里通过sendEmptyMessage函数发消息.Han ...
- iOS上传代码到Github平台
对于开发人员来说,很多时候想把自己好的代码 demo放到一个公共平台,与大家交流,Github就是一个不错的平台,下面给大家说说Github的具体使用方法. 第一步.申请Github账号.https: ...
- 实例了解js面向对象的封装和继承等特点
1.面向对象特点 相比之前按照过程式写法,面向对象有以下几个特点; 1.抽象:抓住核心问题,就是将很多个方法放在一个对象上.对象由属性和方法组成,属性就是我们定义的变量,它是静态的:方法就是行为操作, ...
- 前端基本知识(三):JS的闭包理解
JS闭包的理解 一.变量的作用域 二.如何从外部读取局部变量 三.什么是闭包 四.深入理解闭包 五.闭包的用途 六.使用闭包注意情况 七.JavaScript的垃圾回收机制 八.一些思考题 一.变量作 ...
- 学习接水系统(java+thread线程)
(一)项目框架分析 对于学生并发接水项目,根据面向对象的思想,需要创建两个对象,即学生和水龙头. 接下来主要讲解不排队接水和排队接水两张情况. 项目的目录文件如下: (二)不排队接水 假设有四个学生小 ...