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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 萧萧北 中级黑马   /  2013-7-3 09:22  /  2016 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜光 于 2013-7-3 12:10 编辑
  1. import java.net.*;
  2. /*
  3. 需求:
  4. 定义一个应用程序,用于接收udp协议传输的数据并处理的。


  5. 定义udp的接收端。
  6. 思路:
  7. 1,定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。
  8. 方便于明确哪些数据过来该应用程序可以处理。

  9. 2,定义一个数据包,因为要存储接收到的字节数据。
  10. 因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
  11. 3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
  12. 4,通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
  13. 5,关闭资源。
  14. */



  15. class UdpRece
  16. {
  17. public static void main(String[] args) throws Exception
  18. {
  19. //1,创建udp socket,建立端点。
  20. DatagramSocket ds = new DatagramSocket(10000);
  21. while(true)
  22. {
  23. //2,定义数据包。用于存储数据。
  24. byte[] buf = new byte[1024];
  25. DatagramPacket dp = new DatagramPacket(buf,buf.length);

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


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

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

  31. int port = dp.getPort();

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

  33. }
  34. //5,关闭资源
  35. //ds.close();

  36. }
  37. }


  38. /*
  39. 需求:通过udp传输方式,将一段文字数据发送出去。,
  40. 定义一个udp发送端。
  41. 思路:
  42. 1,建立updsocket服务。
  43. 2,提供数据,并将数据封装到数据包中。
  44. 3,通过socket服务的发送功能,将数据包发出去。
  45. 4,关闭资源。

  46. */


  47. class UdpSend
  48. {
  49. public static void main(String[] args) throws Exception
  50. {
  51. //1,创建udp服务。通过DatagramSocket对象。
  52. DatagramSocket ds = new DatagramSocket(10000);

  53. //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)

  54. byte[] buf = "udp ge men lai le ".getBytes();
  55. DatagramPacket dp =
  56. new DatagramPacket(buf,buf.length,InetAddress.getByName("183.224.94.24"),10000);

  57. //3,通过socket服务,将已有的数据包发送出去。通过send方法。
  58. ds.send(dp);

  59. //4,关闭资源。

  60. ds.close();

  61. }
  62. }


复制代码
这是跟着老毕视频敲的代码,可是运行发送端时,一直报错,麻烦大家帮忙看看

在MyEclips中如下:
  1. Exception in thread "main" java.net.BindException: Address already in use: Cannot bind
  2. at java.net.PlainDatagramSocketImpl.bind0(Native Method)
  3. at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:82)
  4. at java.net.DatagramSocket.bind(DatagramSocket.java:368)
  5. at java.net.DatagramSocket.<init>(DatagramSocket.java:210)
  6. at java.net.DatagramSocket.<init>(DatagramSocket.java:261)
  7. at java.net.DatagramSocket.<init>(DatagramSocket.java:234)
  8. at day23.Sockets.main(Sockets.java:19)
复制代码

22.png (13.87 KB, 下载次数: 0)

22.png

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

7 个回复

倒序浏览
DatagramSocket ds = new DatagramSocket(10000);

DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("183.224.94.24"),10000);

第一个端口号代表你本地的端口,发送的端口
第二个端口代表接收方端口,两个不能一至的,不然会占用同一端口,所以端口绑定错误
回复 使用道具 举报
  1. import java.net.*;

  2. /*

  3. 需求:

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



  5. 定义udp的接收端。

  6. 思路:

  7. 1,定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。

  8. 方便于明确哪些数据过来该应用程序可以处理。


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

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

  11. 3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中。

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

  13. 5,关闭资源。

  14. */




  15. class UdpRece

  16. {

  17. public static void main(String[] args) throws Exception

  18. {

  19. //1,创建udp socket,建立端点。

  20. DatagramSocket ds = new DatagramSocket(10000);

  21. while(true)

  22. {

  23. //2,定义数据包。用于存储数据。

  24. byte[] buf = new byte[1024];

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


  26. //3,通过服务的receive方法将收到数据存入数据包中。

  27. ds.receive(dp);//阻塞式方法。



  28. //4,通过数据包的方法获取其中的数据。

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


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


  31. int port = dp.getPort();


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


  33. }

  34. //5,关闭资源

  35. //ds.close();


  36. }

  37. }



  38. /*

  39. 需求:通过udp传输方式,将一段文字数据发送出去。,

  40. 定义一个udp发送端。

  41. 思路:

  42. 1,建立updsocket服务。

  43. 2,提供数据,并将数据封装到数据包中。

  44. 3,通过socket服务的发送功能,将数据包发出去。

  45. 4,关闭资源。


  46. */



  47. class UdpSend

  48. {

  49. public static void main(String[] args) throws Exception

  50. {

  51. //1,创建udp服务。通过DatagramSocket对象。

  52. DatagramSocket ds = new DatagramSocket(10000);//这里的端口不能指定可以在发送的时候手动给出。


  53. //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)

  54. byte[] buf = "udp ge men lai le ".getBytes();
  55. int  port  =10000;

  56. DatagramPacket dp =
  57. new DatagramPacket(buf,buf.length,InetAddress.getByName("183.224.94.24"),port);//这里改成port 就没问题了


  58. //3,通过socket服务,将已有的数据包发送出去。通过send方法。

  59. ds.send(dp);


  60. //4,关闭资源。


  61. ds.close();


  62. }

  63. }
复制代码
回复 使用道具 举报
发送的时候手动给出?

这句话我不太明白啊,请问一下你说的指定和手动给出是个什么区别呢?
回复 使用道具 举报
梦想蓝色天空 发表于 2013-7-3 09:33
DatagramSocket ds = new DatagramSocket(10000);

DatagramPacket dp = new DatagramPacket(buf,buf.lengt ...

简洁明了,谢谢啦,改了本地发送端口果然就可以了:loveliness:
回复 使用道具 举报
萧萧北 发表于 2013-7-3 09:54
这句话我不太明白啊,请问一下你说的指定和手动给出是个什么区别呢?

DatagramSocket()
          构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket(int port)
          创建数据报套接字并将其绑定到本地主机上的指定端口。
这是api上的原话。如果你指定的端口无法使用就会发生错误啊。 而监听端口则没有问题。发送的时候,指定端口为了服务器端的监听
回复 使用道具 举报
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。
回复 使用道具 举报
杜光 发表于 2013-7-3 12:10
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。

恩 好的 版主辛苦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马