java - UDP 广播问题
问题描述
我正在尝试一个简单的问题,即通过 UDP 广播从服务器向客户端发送一些随机数。据我所知,如果我向特定的 IP 地址和端口号广播,则连接到该频道的所有用户都可以收听。我在互联网上寻找示例代码并基于此开发了我的代码。但是每当我尝试运行代码时,我的服务器会在客户端获得任何东西之前关闭套接字。
服务器代码是:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.security.SecureRandom;
public class Server {
public static void main(String[] args) throws IOException {
DatagramPacket packet;
InetAddress address;
DatagramSocket socket;
System.out.println("Sending Numbers!");
socket = new DatagramSocket();
try {
int n = 10;
SecureRandom rand = new SecureRandom();
address = InetAddress.getByName("233.0.0.1");
for(int i = 0; i < n; i++)
{
int num = rand.nextInt(100);
byte[] tmp = Integer.toString(num).getBytes();
packet = new DatagramPacket (tmp, 0, address, 1502);
socket.send(packet);
System.out.println("Number has been sent!");
}
} catch (Exception e) {
System.out.println("Error: " + e);
} finally {
try {
socket.close();
} catch (Exception e) {
System.out.println("Error2: " + e);
}
}
}
}
客户端代码为:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.ByteBuffer;
public class Client {
public static void main(String[] args) throws IOException {
// Initialization
int n = 10;
// Create the socket
int port = 1502;
DatagramSocket socket;
DatagramPacket packet = null;
socket = new DatagramSocket(port);
for (int i = 0; i < n; i++)
{
socket.receive (packet);
byte[] numb = packet.getData();
int num = ByteBuffer.wrap(numb).getInt();
System.out.println(Integer.toString(num));
}
}
}
然后,我尝试使用 javac 和 java 编译每个代码。
javac Server.java
java package_name.Server
我首先使用上述方法运行服务器,然后是客户端。我得到客户端的 NullPointerException。如果我明白我在这里做错了什么,那将非常有帮助。
我在命令窗口中运行它们。对于服务器,我得到这个 服务器 对于客户端:客户端
编辑:我能够在服务器和客户端之间进行通信。但是,我只得到第一个数字。此外,如果我初始化Datagram
大小 >2,我得到NumberFormatException
. 这是改进后的代码。
服务器代码:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.security.SecureRandom;
public class Server {
public static void main(String[] args) throws IOException {
DatagramPacket packet;
InetAddress address;
DatagramSocket socket;
System.out.println("Sending Numbers!");
socket = new DatagramSocket();
try {
int n = 10;
SecureRandom rand = new SecureRandom();
address = InetAddress.getByName("127.0.0.1");
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintStream pout = new PrintStream( bout );
for(int i = 0; i < n; i++)
{
int num = rand.nextInt(100);
pout.print(num);
byte[] barray = bout.toByteArray();
packet = new DatagramPacket (barray, barray.length, address, 1502);
socket.send(packet);
System.out.println("Number has been sent!");
System.out.println(num);
}
} catch (Exception e) {
System.out.println("Error: " + e);
} finally {
try {
socket.close();
} catch (Exception e) {
System.out.println("Error2: " + e);
}
}
}
}
客户代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Client {
public static void main(String[] args) throws IOException {
// Initialization
int n = 10;
// Create the socket
int port = 1502;
DatagramSocket socket;
byte[] buf = new byte[2];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket = new DatagramSocket(port);
for (int i = 0; i < n; i++)
{
socket.receive (packet);
int num = Integer.parseInt(new String(packet.getData()));
System.out.println(num);
}
}
}
现在可能是什么问题?
编辑2:最后,我让它工作了。只需将bout
andpout
放入for
循环中,它就可以工作了!
解决方案
你需要DatagramPacket
在你的客户端初始化你的 - 它不能为空
int n = 10;
// Create the socket
int port = 1502;
DatagramSocket socket;
byte[] buf = new byte[1000];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket = new DatagramSocket(port);
for (int i = 0; i < n; i++)
{
socket.receive (packet);
byte[] numb = packet.getData();
int num = ByteBuffer.wrap(numb).getInt();
System.out.println(Integer.toString(num));
}
此外,此代码需要在您之前运行Server
推荐阅读
- javascript - 开关中的Javascript异常处理
- php - 附加到不存在的元素
- python - 使用 Pandas 根据下一次出现更改数据框值
- javascript - 如何在Javascript中删除所有出现的字符串
- asp.net-core - Asp.Net Core Spa,ConfirmEmail成功后如何重定向
- scala - 如何在不退出 sbt 的情况下刷新资源
- javascript - datepicker() 未解析的函数或方法
- reactjs - 未捕获的 TypeError:this.props.getData 不是函数
- ios - 在 Xcode 的目录中找不到媒体文件
- reactjs - NSCameraUsageDescription 不适用于 Expo Application