刚开始学习UDP,写了一个小例子,结果接收端接收不到信息,求解答

KingsleyAdam 2016-02-23 01:45:41
发送端代码如下:

package Day23.Internet;

import java.awt.event.HierarchyEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

//发送端
public class Demo2Sender {

public static void main(String[] args) {
// 发送端的使用步骤
DatagramSocket datagramSocket = null;
DatagramPacket datagramPacket = null;

// 1.建立UDP服务
try {
datagramSocket = new DatagramSocket();
System.out.println("建立UDP服务成功!!");
} catch (SocketException e) {
e.printStackTrace();
}

// 2.准备数据,把数据封装在数据包中

// 在数据包里面应该表明是给谁的
String data = "这是一个UDP的例子。。。";
// DatagramPacket datagramPacket = new DatagramPacket(buf, length,
// address, port)
// buf:发送的字节数组;length:发送的数据内容的大小;address:发送的目的IP地址对象;port:端口号;
try {
datagramPacket = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(),
60090);
System.out.println("建立数据包成功!!");
} catch (UnknownHostException e) {
e.printStackTrace();
}

// 3.货物装好了发货了
// 调用udp的服务发送数据包
try {
datagramSocket.send(datagramPacket);
System.out.println("发送成功!!");
} catch (IOException e) {
e.printStackTrace();
}

// 4.关闭资源-----实际上就是释放占用的端口号

if (datagramSocket != null) {
datagramSocket.close();
System.out.println("关闭成功");
System.out.println("hehe");
}
}

}


接收端代码如下:

package Day23.Internet;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

//接收端
public class Demo2Receiver {

public static void main(String[] args) throws IOException {
DatagramSocket socket = null;
DatagramPacket datagramPacket = null;
// 1.建立一个UDP的服务
try {
socket = new DatagramSocket(60090);
System.out.println("建立UDP服务成功!!");
} catch (SocketException e) {
e.printStackTrace();
}
System.out.println("hehe");
byte[] buf = new byte[1024];

// 2. 准备空的数据包用于存放数据
datagramPacket = new DatagramPacket(buf, buf.length);

// 3.调用udp的服务接受数据
socket.receive(datagramPacket);// receive方法是一个阻塞类型的方法,在没有接收到数据前是阻塞的
// 数据实际上是存储到了buf的字节数组中
System.out.println("数据包接收数据成功!!");

System.out.println("接收端接收到的数据是:" + new String(buf, 0, datagramPacket.getLength()));

// 4.关闭资源
if(socket!=null)
socket.close();
}
}
...全文
250 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
KingsleyAdam 2016-02-24
  • 打赏
  • 举报
回复
诶我试了一下 把那个发送端的数据包的 InetAddress对象由InetAddress.getLocalHost() 变为InetAddress.getByName("localhost")就可以了 为什么呀!难道不都是向本机发送么 二者返回值有什么不一样么?
KingsleyAdam 2016-02-24
  • 打赏
  • 举报
回复
刚才试了一下还是不对,我是先启动的接收端 然后再启动的发送端 发送端已经提示发送了 可是接收端却并没有接受 这究竟是怎么回事,难道有什么细节没有注意到么?
KingsleyAdam 2016-02-24
  • 打赏
  • 举报
回复
我在发送端已经写了IP对象是 InetAddress.getLocalHost() 返回的就是本机的IP地址的对象 我也不知道为什么…… 后来就莫名其妙的好使了 然后我试验在局域网中群发消息使用主机名为255的广播地址来发送消息,结果本机又接收不到了
daishaodong 2016-02-23
  • 打赏
  • 举报
回复
发送的数据报实例化时:InetAddress.getByName("localhost"), 9000); // 调用getByName()方法可以返回一个InetAddress类的实例对象, 是否因为你没有调用getByName()方法,导致没生成InetAddress类的实例
daishaodong 2016-02-23
  • 打赏
  • 举报
回复
接收端把字节数组转换成字符串时(实例化字符串对象时),你直接用字节数组实例名buf作为构造方法的第一个参数,书上是用 DatagramPacket对象名.getData()来作为构造方法第一个参数,不知道行否?我也是新手。 还有udp协议应该也是在ip协议之上的,2台电脑要相互能ping通吧。
daishaodong 2016-02-23
  • 打赏
  • 举报
回复
先运行接收端了?书上对发送端的数据包实例化是这样:new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("localhost"),接收端端口号) 貌似你数据包实例化时,没有写明接收端ip地址

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧