Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UDP多线程服务器设计问题_Java_Multithreading_Udp - Fatal编程技术网

Java 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

我正在为UDP多线程服务器编写一个程序。我已经根据从堆栈溢出中获取的输入和psuedo代码编写了引号。当我执行程序时,我的计算机正在挂断。是否有人可以用下面的代码更正此问题,并为我提供编写UDP服务器的最佳解决方案,以处理多线程

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套接字。这是令人困惑的-请更正以消除歧义。当我运行程序时,我得到服务器弹出窗口,控制台中没有任何错误,但我的笔记本电脑没有像以前那样响应。它有时完全冻结,我再次重新启动笔记本电脑。我希望这能澄清上述问题