------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员——29,网络编程UDP
一:网络传输---->
网络传输一般是先找到IP地址然后把数据发送到对方指定的应用程序上,网络应用程序都用数字进行标示,就是逻辑端口。通信规则就是协议,国际组织通信规则是TCP/IP。网络参考模型如图1所示。
图1
数据传输的时候都是从应用层开始往下推进,每过一层都会被数据封包,再经过传输线路传输到对方的主机上,再从物理层往上层层递进,每过一层都会被数据拆包,最后获得数据。
前期学习编程都是在传输层和网际层编程。后期做java开发则是在应用层编程。传输层最常见协议是TCP和UDP,网际层常见协议就是IP。应用层http协议。
二:网络通信三要素---->
1, IP地址:网络设备标示,本地循环地址127.0.0.1主机名localhost,IP地址是IP使用的32位或128位无符号数字,低级协议,TCP和UDP都是基于它建立而成的。
2, 端口号:标示进程的逻辑地址,0到65535,其中0到1024系统使用或者保留端口。
3, 传输协议:常见的TCP/UDP
Java.net包就是关于网络编程的数据包。
IP地址常用InetAddress类来表示,InetAddress常用的方法:
package momo;
import java.net.*;
public class Wuo
{
publicstatic void main(String[] args)throws Exception
{
InetAddress ia=InetAddress.getLocalHost();//获取本地地址
String sAddress= ia.getHostAddress();//获取IP号
String sName=ia.getHostName();//获取IP名
sop("sName----"+sName); //sName----PYDAVFTNLUJKQQD
sop("sAddress----"+sAddress);//sAddress----192.168.1.2
//用getByName方法获取任意一台主机IP地址
InetAddress iaget =InetAddress.getByName("192.168.1.9");
String sdizhi=iaget.getHostAddress();
String smingzi=iaget.getHostName();
sop(smingzi);//192.168.1.9
//找不到名字就返回IP地址号
sop(sdizhi);//192.168.1.9
InetAddress iabaidu=InetAddress.getByName("www.baidu.com");
sop( iabaidu.getHostAddress());//180.97.33.107
sop(iabaidu.getHostName());//www.baidu.com
//因为百度网有多态主机所以返回的IP地址不唯一
}
public static void sop(Object obj)//打印方法
{
System.out.println(obj);
}
}
三:TCP与UDP-->
UDP:1,将数据,源,目的封装到数据包中。
2, 不需要建立连接,速度快。
3,数据包限制在64k。
4,不可靠协议。
TCP:1,必须建立连接形成数据通道,效率比较低
2,大量数据传输
3, 通过三次握手协议完成连接,(客户端:你好。服务端:已收到,你好。客户端:已收到。)可靠协议。
UDP传输:
UDP传输编程步骤:
1, 建立DatagramSocket端点,最好写上端口号
2, 定义数据包,发送端的数据包往标记需要传输的数据和IP地址和端口,接收端的数据包要设定好接收的数组大小。
3, 发送端发送send,接收端接收receive
4, 调用数据包的相关方法获取数据
5, 关闭资源close()
//发送端
public static void fsd() throws Exception
{
//发送端
//建立DatagramSocket端点
DatagramSocket ds= new DatagramSocket(10011);
//定义数据包
byte[] by="我是超人".getBytes();
DatagramPacket dgp=new DatagramPacket(by,by.length,InetAddress.getByName("192.168.1.2"),10012);
//发送数据包
ds.send(dgp);
//关闭资源
ds.close();
}
//接收端
public static void jsd()throws Exception
{
//建立DatagramSocket端点
DatagramSocket ds=new DatagramSocket(10012);
//定义数据包
byte[] by=new byte[1024];
DatagramPacket dgp=new DatagramPacket(by,by.length);
//接收数据
ds.receive(dgp);
//调用数据包相关方法读取数据
InetAddress ia= dgp.getAddress();//获取地址
String sAddress= ia.getHostAddress();//获取地址号
String sName= ia.getHostName(); //获取地址名
int i=dgp.getPort();//获取端口号
sop(sName+"----"+sAddress+"----"+i);
//关闭资源
ds.close();
}
其中sop是打印方法:
public static void sop(Object obj)//打印方法
{
System.out.println(obj);
}
通过键盘读取数据再进行UDP发送,这里就用到了流,所以要导入io包。
import java.net.*;
import java.io.*;
class Wuo
{
//发送端
publicstatic void main(String[] args) throws Exception
{
//建立端点
DatagramSocket ds=new DatagramSocket(10011);
//获取键盘数据的读取流
BufferedReader bur=new BufferedReader(new InputStreamReader(System.in));
String s=null;
while((s=bur.readLine())!=null)//不断的读取数据
{
if(s.equals("over"))//停止读取数据
{
break;
}
byte[] by=s.getBytes();
//定义数据包
DatagramPacket dgp=new DatagramPacket(by,by.length,InetAddress.getByName("192.168.1.2"),10012);
//192.168.1.255是广播地址,向这个地址发数据可以发到该网络中的所有主机
//192.168.1.0表示一个网络地址段
//发送数据
ds.send(dgp);
}
//关闭资源
ds.close();
}
}
所以,利用UDP再配合上多线程,还可以编写一个简陋的聊天程序。(需要注意的是要保持接收端的开启,才能够保持实时接收到对方的数据。)UDP传输也是经常用在视频会谈上。
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------