介绍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. 查询数据库后台Block 的Sql存储过程

    查询数据库后台Block 的Sql存储过程 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER OFF GO /*记录SQL Server的阻塞情况 wang 200 ...

  2. PHP持续保有长连接,利用flush持续更新浏览器UI,下载进度条实现

    如何用PHP+JS实现上传进度条,大部分的人可能都实现过,但是下载呢?如何呢?原理也是差不多的,就是分次读写,每次读多少字节,但是这样的不好就是长连接,一般实现下载进度条常用的两种解决方案是:一种是需 ...

  3. because of many connection errors; unblock with 'mysqladmin flush-hosts

    环境:linux,mysql5.5.37 错误:Host is blocked because of many connection errors; unblock with 'mysqladmin ...

  4. [OIDC in Action] 2. 基于OIDC(OpenID Connect)的SSO(纯JS客户端)

    在上一篇基于OIDC的SSO的中涉及到了4个Web站点: oidc-server.dev:利用oidc实现的统一认证和授权中心,SSO站点. oidc-client-hybrid.dev:oidc的一 ...

  5. ipa企业签名

    包天包周包月季度包年套餐_app/ios应用企业签名_ios企业签名 常见问题 需要提供 App 的源码吗? 不需要源码,只发 ipa 或者 app 格式的安装包即可. 客户怎么安装签名好的软件? 安 ...

  6. 层居中绝对定位的div的居中方法,下面的写法兼容IE系列浏览器和火狐浏览器

    详细解说,直接看样式:#dingwei{padding:10px;background-color:#003300;color:#FFFFFF; width:600px;height:300px; d ...

  7. PHP通过身份证号码获取性别、出生日期、年龄等信息

    $sex = substr($idcard, (strlen($idcard)==18 ? -2 : -1), 1) % 2 ? '1' : '2'; //18位身份证取性别,倒数第二位奇数是男,偶数 ...

  8. springBoot(10)---logback日志

    logback日志 一.概述  和log4j优点: 实际上,这两个日志框架都出自同一个开发者之手,Logback 相对于 Log4J 有更多的优点 (1)logback不仅性能提升了,初始化内存加载也 ...

  9. POJ - 1039 Pipe(计算几何)

    http://poj.org/problem?id=1039 题意 有一宽度为1的折线管道,上面顶点为(xi,yi),所对应的下面顶点为(xi,yi-1),假设管道都是不透明的,不反射的,光线从左边入 ...

  10. [golang note] 网络编程 - RPC编程

    net包 • 官方文档 http://godoc.golangtc.com/pkg/net/ Package net provides a portable interface for network ...