黑马程序员技术交流社区

标题: 关于UDP通信 [打印本页]

作者: 位雪    时间: 2012-7-17 21:42
标题: 关于UDP通信
本帖最后由 位丹丹 于 2012-7-17 22:15 编辑
  1. import java.net.*;

  2. class UdpSend
  3. {
  4. public static void main(String[] args) throws Exception
  5. {
  6. DatagramSocket ds = new DatagramSocket(8888);
  7. byte[] buf = "udp ge men lai le ".getBytes();
  8. DatagramPacket dp =
  9. new DatagramPacket(buf,buf.length,InetAddress.getByName("123.163.215.207"),10000;//我的ip地址
  10. ds.send(dp);
  11. ds.close();
  12. }
  13. }
  14. class UdpRece
  15. {
  16. public static void main(String[] args) throws Exception
  17. {
  18. while(true)
  19. {
  20. DatagramSocket ds = new DatagramSocket();
  21. byte[] buf = new byte[1024];
  22. DatagramPacket dp = new DatagramPacket(buf,buf.length);
  23. ds.receive(dp);
  24. String ip = dp.getAddress().getHostAddress();
  25. String data = new String(dp.getData(),0,dp.getLength());
  26. int port = dp.getPort();
  27. System.out.println(ip +"::"+data+"::"+port);
  28. }
  29. //ds.close();

  30. }
  31. }
复制代码
接收端一直接收不到数据,是因为网络原因还是其他的,请高手指点。。。。

1.png (42.88 KB, 下载次数: 172)

接收

接收

2.png (32.38 KB, 下载次数: 201)

上传

上传

作者: 赵倩倩    时间: 2012-7-17 21:49
这个问题很简单啊 就是因为你是在本机演示 所以你的IP应该是本机的 127.0.0.1
class UdpSend
{
        public static void main(String[] args) throws Exception
        {
          //1、创建udp服务,通过DatagramSocket对象。
          DatagramSocket ds=new DatagramSocket();
          //2、确定数据,并封装成数据包
          byte[] data="udp gemen lai le".getBytes();
          DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
                //3、通过socket服务,将已有的数据包发送出去使用send()方法
                ds.send(dp);
                //4、关闭资源
                ds.close();
       
        }
}
作者: 位雪    时间: 2012-7-17 21:57
赵倩倩 发表于 2012-7-17 21:49
这个问题很简单啊 就是因为你是在本机演示 所以你的IP应该是本机的 127.0.0.1
class UdpSend
{

还是接收不到呀、、、、、
作者: 梁小波    时间: 2012-7-17 22:02
你在udpRece中应该指定监听端口呀!没有端口怎么知道从哪儿接受数据!
DatagramSocket ds = new DatagramSocket(10000);
这句我建议放到while循环外面!这样这要有一个socket就可以你重建的只是packet包
不用循环建立socket。
作者: 赵倩倩    时间: 2012-7-17 22:03
位丹丹 发表于 2012-7-17 21:57
还是接收不到呀、、、、、

两端都给你了 比较下 哪里不一样

class  UdpRece
{
        public static void main(String[] args)
        {
                //1、创建udp socket,建立端点,
                //注意:不能放while里,因为有绑定异常,地址已经被使用。
                DatagramSocket ds=new DatagramSocket(10000);
                while (true)
                {
                        //2、定义数据包,用于存储数据。
                        byte[] buf=new byte[1024];
                        DatagramPacket dp=new DatagramPacket(buf,buf.length);

                        //3、通过服务的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();
        }
}

作者: 赵倩倩    时间: 2012-7-17 22:06
本帖最后由 赵倩倩 于 2012-7-17 22:08 编辑

你的这个有三个地方1、这里首先要指定端口2、发送端的IP要改成127.0.0.1 自己的网卡  3、DatagramSocket ds=new DatagramSocket(10000);要写在while外面因为 //不能放while里,因为有绑定异常,地址已经被使用。
DatagramSocket ds=new DatagramSocket(10000);              
  while (true)
                {

作者: 位雪    时间: 2012-7-17 22:15
赵倩倩 发表于 2012-7-17 22:06
你的这个有三个地方1、这里首先要指定端口2、发送端的IP要改成127.0.0.1 自己的网卡  3、DatagramSocket ds ...

:handshake,谢谢!
作者: 孙飞    时间: 2012-7-17 22:39
我给你改了一下,你有两个问题,一是你没指定监听的端口,二是你把接收代码建立服务的代码放在循环语句里面了
import java.net.*;
import java.io.*;
class UdpSend
{
public static void main(String[] args) throws Exception
{
  DatagramSocket ds = new DatagramSocket();
  byte[] buf = "udp ge men lai le ".getBytes();
  DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.37"),9000);//这里是我的IP,你可以填你自己的然后指定一个要发送的端口
  ds.send(dp);
  ds.close();
}
}
class UdpRece
{
public static void main(String[] args) throws Exception
{
  DatagramSocket ds= new DatagramSocket(9000);//首先你要在这里指定监听的端口,然后这里你不能放在while循环里面,如果放里面每次都会new 出一个服务去监听同一个端口,出现异常
  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());
   int port = dp.getPort();
   System.out.println(ip +"::"+data+"::"+port);
  }
  //ds.close();
}
}

作者: 康大玮    时间: 2012-7-18 00:04
我的可以啊!



这是我的代码!

你用cmd命令模式:
编译以后,首先java  UdpRece
     然后java UdpSend

import java.net.*;

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

*/


class  UdpSend
{
        public static void main(String[] args) throws Exception
        {
                //1,创建udp服务。通过DatagramSocket对象。
                DatagramSocket ds = new DatagramSocket(8888);

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

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

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

                //4,关闭资源。

                ds.close();

        }
}

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


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

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

*/


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

                //3,通过服务的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();

        }
}


6LC5GL~CIVHUT7_2E$JE@PQ.jpg (43.44 KB, 下载次数: 167)

6LC5GL~CIVHUT7_2E$JE@PQ.jpg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2