标签:黑马程序员
------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传输也是经常用在视频会谈上。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:黑马程序员
原文地址:http://blog.csdn.net/dangaodeaiyi/article/details/48001883