黑马程序员—网络编程之UDP

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

网络编程UDP

一、UDP服务器端的设计:

定义UDP的接收端

思路:

 1、定义UdpSocket服务

 2、定义一个数据包,因为要存储接收到的字节数据

     因为数据包对象中有更多功能可以提取字节数据中的不同数据信息

 3、通过Socket服务的receive方法将收到的字节数据存入已定义好的数据包中

 4、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上

 5、关闭资源

 

定义一个应用程序,用于接收UDP协议传输的数据并处理

publicclass UdpReceive {

 

    publicstaticvoid main(String[] args) throws Exception

    {

       //1、建立UDP服务,并指定监听端口

       DatagramSocket ds = new DatagramSocket(9999);

      

       while(true)//循环接收数据

       {

           //2、定义一个用来存储字节数据的数据包

           byte[] buf = newbyte[1024];

           DatagramPacket dp = new DatagramPacket(buf, buf.length);

           //3、将接收到的数据存入定义好的数据包中

           ds.receive(dp);

           //4、通过数据包对象的功能获得数据包中的数据信息

           String ip = dp.getAddress().getHostAddress().toString();

           String mes = new String(dp.getData(),0,dp.getLength());

           int port = dp.getPort();

           System.out.println(ip+"::"+mes+"::"+port);

       }

       //5、关闭资源

       //ds.close();

    }

 

}

 

二、UDP 发送端的设计

思路:

 1、建立UDPSocket服务

 2、提供数据,并将数据封装到数据包中

 3、通过Socket服务的发送功能,将数据包发送出去

 4、关闭资源

通过UDP 传输方法将一段文字数据发送出去

publicclass UdpSend {

 

    publicstaticvoid main(String[] args) throws IOException

    {

       //1、创建UDP服务,通过DatagramSocket对象

       DatagramSocket ds = new DatagramSocket();

       //2、确定数据,并封装成数据包

       byte[] buf = "lsk is coming!".getBytes();

        DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.36.115.33"),8090);

       //3、通过Socket服务,将封装好的数据包发送出去,通过send()方法

       ds.send(dp);

       //4、关闭资源

       ds.close();

 

    }

 

}

 

三、UDP应用多线程实现同一界面消息的发送和接受

 

编写一个聊天程序

有收数据的部分和发数据的部分

   这两部分需要同时执行

   那就需要用到多线程技术

   一个线程控制收,一个线程控制发

    

   因为收和发动作是不一致的,所以要定义两个run方法

首先,接收线程如下:

class Receive implements Runnable

{

    //定义UDP服务

    private DatagramSocket ds;

   

    public Receive(DatagramSocket ds)

    {

       this.ds = ds;

    }

   

    //实现run()方法

    publicvoid run()

    {

       try

        {

           while(true)

           {

              //定义一个字节数组用于存放接收数据

              byte[] buf = newbyte[1024];

             

              //将接收的数据封装数据包

              DatagramPacket dp = new DatagramPacket(buf,buf.length);

             

              //接收数据

              ds.receive(dp);

             

              //输出接收的数据信息

              String ip = dp.getAddress().getHostAddress();

              String data = new String(dp.getData(),0,dp.getLength());

              System.out.println(ip+":"+data);

           }

       }

       catch(Exception e)

       {

           System.out.println("Receive failed");

       }

    }

}

其次,定义UDP的发送线程

class Send implements Runnable

{

    //定义UDP 服务

    private DatagramSocket ds;

   

    public Send(DatagramSocket ds)

    {

       this.ds = ds;

    }

    publicvoid run()

    {

       try

       {

           //定义字符输出缓冲流用来输入数据

           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

          

           String line = null;

           //循环发送数据

           while((line=br.readLine())!=null)

           {

              //如果发送的数据是88就结束

              if(line.equals("88"))

                  break;

              //将输入的数据转换成字节数据

              byte[] buf = line.getBytes();

              //将数据封包发送到指定IP的指定端口

              DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.137.165"),10005);

              ds.send(dp);

           }

          

       }

       catch(Exception e)

       {

           System.out.println("Send failed!");

       }

    }

}

 

 

最后,在主函数中调用这两个线程

publicclass ChatDemo {

 

    publicstaticvoid main(String[] args) throws SocketException

    {

       //创建发送服务

       DatagramSocket sds = new DatagramSocket();

       //创建接收服务并指定端口

       DatagramSocket rds = new DatagramSocket(10005);

       //调用线程

       new Thread(new Send(sds)).start();

       new Thread(new Receive(rds)).start();

    }

 

}

 

 

 

 

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值