Java 为什么我的简单网络程序崩溃了?
因此,我正在学习互联网上使用指南的UDP网络。我找到了一个指南,大部分是复制/粘贴的代码,它起了作用。很明显,我想自己扩张。我试图做一件简单的事情,给服务器客户端鼠标位置,然后服务器将发送回完全相同的消息给所有CAP。但由于某些原因,它可以完美地工作在0-100次之间,然后停止。这是我的密码: 服务器:Java 为什么我的简单网络程序崩溃了?,java,network-programming,udp,java-io,Java,Network Programming,Udp,Java Io,因此,我正在学习互联网上使用指南的UDP网络。我找到了一个指南,大部分是复制/粘贴的代码,它起了作用。很明显,我想自己扩张。我试图做一件简单的事情,给服务器客户端鼠标位置,然后服务器将发送回完全相同的消息给所有CAP。但由于某些原因,它可以完美地工作在0-100次之间,然后停止。这是我的密码: 服务器: public class Server implements Runnable { boolean running = false; long time; InetAd
public class Server implements Runnable {
boolean running = false;
long time;
InetAddress IPAddress;
int port;
public static void main(String[] args) throws Exception {
Thread th = new Thread(new Server());
th.start();
}
public Server() throws Exception {
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
System.out.println("Server started");
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
IPAddress = receivePacket.getAddress();
port = receivePacket.getPort();
System.out.println("Client connected at " + IPAddress);
String send = "Connected!";
sendData = send.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
serverSocket.close();
time = System.nanoTime();
running = true;
}
public void run() {
int x = 0;
while(running) {
if(System.nanoTime() > time + 60/(1e9)) {
time = System.nanoTime();
try {
x++;
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
System.out.println("Received message");
IPAddress = receivePacket.getAddress();
port = receivePacket.getPort();
String sentence = new String(receivePacket.getData());
System.out.println("RECEIVED " + sentence);
String capSentence = sentence.toUpperCase();
sendData = capSentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
System.out.println("Sent message.");
System.out.println(x);
serverSocket.close();
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
}
}
客户:
public class Client implements Runnable {
boolean foundConnection = false;
boolean running = false;
long time;
public static void main(String[] args) throws Exception {
Thread th = new Thread(new Client());
th.start();
}
public Client() throws Exception {
time = System.nanoTime();
running = true;
}
public void run() {
while(running) {
if(System.nanoTime() > time + (60/1e9)) {
time = System.nanoTime();
try {
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("localhost");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String send = "Mouse is at " + mouse();
sendData = send.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
System.out.println("Sent message.");
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
System.out.println("Received message.");
String modSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER: " + modSentence);
clientSocket.close();
} catch(Exception e) {
System.out.println("Error");
}
}
}
}
public static Point mouse() {
return new Point((int)MouseInfo.getPointerInfo().getLocation().getX(),
(int)MouseInfo.getPointerInfo().getLocation().getY());
}
}
可能是因为它没有正确同步,服务器在客户端到达检查消息的代码部分之前发送消息?我不知道,因为我对这真的很陌生。我想知道为什么会发生这种情况,以及如何解决它!很抱歉,代码太乱了,我不熟悉这一点,也不熟悉一般的编码。由于不断打开和关闭服务器套接字,您很可能会遇到同步问题。这将在客户端的发送和服务器的DatagramSocket创建之间创建一个连接。如果客户机在服务器套接字初始化之前发送数据包,服务器将不会收到它,而只是永远等待它。这就是我们所知道的 要避免此问题,只需保持服务器的套接字打开即可。服务器对象初始化时打开它,服务器程序结束时关闭它。这样,客户端发送的数据报将保存在套接字缓冲区中,直到服务器调用接收为止 另一方面,服务器的构造函数和run方法有很多重复的代码。代码重复经常导致程序逻辑的不一致,从而导致错误。尽量避免复制粘贴代码