A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangkai 中级黑马   /  2015-5-31 19:20  /  408 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

需求:定义一个应用程序,用于接收udp协议传输的数据并处理。

定义udp的接收端。
思路:
1,定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。
方便于明确哪些数据过来,该应用程序可以处理。
2,定义一个数据包,因为要存储接收到的字节数据。
因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3,通过socket服务的receive方法将接收到的数据存入已定义好的数据包中。
4,通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
5,关闭资源。

class  UdpRece
{
public static void main(String[] args) throws Exception
{
  //1,创建udpsocket服务,建立端点。
  DatagramSocket ds = new DatagramSocket(10000);
  while(true)
  {
  //2,定义数据包,用于存储数据。
  byte[] buf = new byte[1024];

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

  //3,通过socket服务的receive方法将收到的数据存入数据包中。
  ds.receive(dp);//阻塞式方法。

  //4,通过数据包的方法获取其中的数据。
  String ip = dp.getAddress().getHostAddress();

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

  int port = dp.getPort();

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

  }
  //5,关闭资源。
  //ds.close();

}
}


import java.net.*;
import java.io.*;
class  UdpSend2
{
public static void main(String[] args) throws Exception
{
  DatagramSocket ds = new DatagramSocket();

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

  String line = null;

  while((line=bufr.readLine())!=null)
  {
   if("886".equals(line))
    break;

   byte[] buf = line.getBytes();

   DatagramPacket dp =
    new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);

   ds.send(dp);
  }
  ds.close();
}
}

class  UdpRece2
{
public static void main(String[] args) throws Exception
{
  DatagramSocket ds = new DatagramSocket(10001);

  while(true)
  {
   byte[] buf = new byte[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);
  }
}
}

(3)
编写一个聊天程序。
有收数据的部分和发数据的部分,这两部分需要同时执行。
那就需要用到多线程技术。
一个线程控制收,一个线程控制发。

因为收和发动作是不一致的,所以要定义两个run方法。
而且这两个方法要封装到不同的类中。

import java.net.*;
import java.io.*;
class Send implements Runnable
{
private DatagramSocket ds;
public Send(DatagramSocket ds)
{
  this.ds = ds;
}
public void run()
{
  try
  {
   BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

   String line = null;

   while((line=bufr.readLine())!=null)
   {
    if("886".equals(line))
     break;

    byte[] buf = line.getBytes();

    DatagramPacket dp =
     new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);

    ds.send(dp);   
   }
  }
  catch (Exception e)
  {
   throw new RuntimeException("发送端失败");
  }
}
}

class Rece implements Runnable
{
private DatagramSocket ds;
public Rece(DatagramSocket ds)
{
  this.ds = ds;
}
public void run()
{
  while(true)
  {
   try
   {
    byte[] buf = new byte[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)
   {
    throw new RuntimeException("接收端失败");
   }
  }
}
}

class  ChatDemo
{
public static void main(String[] args) throws Exception
{
  DatagramSocket sendSocket = new DatagramSocket();

  DatagramSocket receSocket = new DatagramSocket(10002);

  new Thread(new Send(sendSocket)).start();
  new Thread(new Rece(receSocket)).start();
}
}:)

2 个回复

倒序浏览
点赞点赞。
回复 使用道具 举报
学习,顶一个。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马