码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员——29,网络编程UDP

时间:2015-08-26 14:01:54      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:黑马程序员

 ------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传输也是经常用在视频会谈上。

 

  

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

黑马程序员——29,网络编程UDP

标签:黑马程序员

原文地址:http://blog.csdn.net/dangaodeaiyi/article/details/48001883

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!