Java UDP多线程服务器设计问题
我正在为UDP多线程服务器编写一个程序。我已经根据从堆栈溢出中获取的输入和psuedo代码编写了引号。当我执行程序时,我的计算机正在挂断。是否有人可以用下面的代码更正此问题,并为我提供编写UDP服务器的最佳解决方案,以处理多线程Java UDP多线程服务器设计问题,java,multithreading,udp,Java,Multithreading,Udp,我正在为UDP多线程服务器编写一个程序。我已经根据从堆栈溢出中获取的输入和psuedo代码编写了引号。当我执行程序时,我的计算机正在挂断。是否有人可以用下面的代码更正此问题,并为我提供编写UDP服务器的最佳解决方案,以处理多线程 public class MyownServer extends JFrame{ private JTextArea jta = new JTextArea(); public static void main(String[] args) throw
public class MyownServer extends JFrame{
private JTextArea jta = new JTextArea();
public static void main(String[] args) throws Exception {
new MyownServer();
}
public MyownServer(){
add(new JScrollPane(jta), BorderLayout.CENTER);
setVisible(true);
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Server");// It is necessary to show the frame here!
try{
DatagramSocket firstsocket = new DatagramSocket(8100);;
int id = 0;
while (true) {
byte[] buf = new byte[256];
DatagramPacket receivePacket =
new DatagramPacket(buf, buf.length);
ClientServiceThread cliThread = new ClientServiceThread(firstsocket, receivePacket);
cliThread.start();
}
}
catch(IOException ex) {
ex.printStackTrace();
}
}
}
public class ClientServiceThread extends Thread {
private JTextArea jta = new JTextArea();
DatagramPacket packet;;
boolean running = true;
DatagramPacket sendPacket;
DatagramSocket socket;;
byte[] buf;
ClientServiceThread(DatagramSocket socket,DatagramPacket packet) {
this.socket=socket;
this.packet=packet;
}
public void run()
{
try {
// Compute and process
byte[] data = new byte[256];
DatagramPacket response = new DatagramPacket(data, data.length);
socket.receive(packet);
double rate = Double.parseDouble(new String(buf).trim());
sendPacket.setAddress(packet.getAddress());
sendPacket.setPort(packet.getPort());
socket.send(sendPacket);
socket.receive(packet);
double years = Double.parseDouble(new String(buf).trim());
socket.send(sendPacket);
socket.receive(packet);
double loan = Double.parseDouble(new String(buf).trim());
double monthlyPayment = loan * (rate / 1200) / (1 - (Math.pow(1 / (1 + (rate / 1200)), years * 12)));
double totalPayment = monthlyPayment * years * 12;
sendPacket.setData(new Double((double)(monthlyPayment * 100) / 100.00).toString().getBytes());
socket.send(sendPacket);
socket.receive(packet);
sendPacket.setData(new Double((double)(totalPayment * 100) / 100.00).toString().getBytes());
socket.send(sendPacket);
socket.close();
jta.append("Interest Rate is " + rate + '\n');
jta.append("Number Of years " + years + '\n');
jta.append("Loan Amount is " + loan + '\n');
jta.append("Monthly payment " + monthlyPayment + '\n');
jta.append("Total Payment " + totalPayment + '\n');
} catch (Exception e) {
e.printStackTrace();
}
}
}
非常感谢您的帮助。提前谢谢。本节就放在这里,永远创建一个又一个线程
while (true) {
byte[] buf = new byte[256];
DatagramPacket receivePacket
= new DatagramPacket(buf, buf.length);
ClientServiceThread cliThread = new ClientServiceThread(firstsocket, receivePacket);
cliThread.start();
}
您应该使用一个。这个部分就在那里,永远创建一个又一个线程
while (true) {
byte[] buf = new byte[256];
DatagramPacket receivePacket
= new DatagramPacket(buf, buf.length);
ClientServiceThread cliThread = new ClientServiceThread(firstsocket, receivePacket);
cliThread.start();
}
您应该使用。您的服务器套接字应该等待从无限循环中的客户端接收连接。您确实有一个循环,但其中缺少一个receive函数调用 receive调用将返回客户端套接字,此后您可以在该套接字上与客户端通信 下面是一个使用DatagramSockets的完整示例
您的服务器套接字应该等待从无限循环中的客户端接收连接。您确实有一个循环,但其中缺少一个receive函数调用 receive调用将返回客户端套接字,此后您可以在该套接字上与客户端通信 下面是一个使用DatagramSockets的完整示例
你能扩展你的答案来说明OP应该如何在应用程序中实现线程池吗?@Ferrybig这超出了范围,太宽泛了。人们应该复制代码块并将它们粘在一起的另一个原因是……你能扩展你的答案来说明OP应该如何在应用程序中实现线程池吗?@Ferrybig这超出了范围,也太宽泛了。另一个原因是人们应该复制代码块并将它们粘在一起……注意,“挂起”是“冻结”的同义词——这是您在查看代码时的意图。“挂起”意味着终止一个调用,因此在这种情况下,它可能意味着您的程序随机关闭UDP套接字。这是令人困惑的-请更正以消除歧义。当我运行程序时,我得到服务器弹出窗口,控制台中没有任何错误,但我的笔记本电脑没有像以前那样响应。它有时完全冻结,我再次重新启动笔记本电脑。我希望这澄清了上述问题说明,“挂起”是“冻结”的同义词-这是您在查看代码时的意图。“挂起”意味着终止一个调用,因此在这种情况下,它可能意味着您的程序随机关闭UDP套接字。这是令人困惑的-请更正以消除歧义。当我运行程序时,我得到服务器弹出窗口,控制台中没有任何错误,但我的笔记本电脑没有像以前那样响应。它有时完全冻结,我再次重新启动笔记本电脑。我希望这能澄清上述问题