Java run()方法未等待数据输入

Java run()方法未等待数据输入,java,server,client,Java,Server,Client,我正在尝试创建一个应用程序,您可以在其中输入两个数字,这些数字经过解析并通过TCP协议发送到服务器,然后添加、返回并设置为文本字段。问题是,run()方法不像BufferedReader streams那样等待输入数字。我目前正在使用DataInputStream和DataOutPutStream 下面是代码 public class Server implements Runnable { public Server(){ } @Override

我正在尝试创建一个应用程序,您可以在其中输入两个数字,这些数字经过解析并通过TCP协议发送到服务器,然后添加、返回并设置为文本字段。问题是,run()方法不像BufferedReader streams那样等待输入数字。我目前正在使用DataInputStream和DataOutPutStream

下面是代码

public class Server implements Runnable {
         public Server(){

    }

    @Override
    public void run() {
        while (true) {
            try (ServerSocket serverSocket = new ServerSocket(1000);
                    Socket sSocket = serverSocket.accept();
    DataInputStream in = new DataInputStream(sSocket.getInputStream());
    DataOutputStream out = new DataOutputStream(sSocket.getOutputStream()))
            {
                System.out.println("Client connected.");
                Integer s1 = in.read();
                Integer s2 = in.read();
                Integer result = s1 + s2;
                out.write(result);



            }
            catch(IOException e) 
            {
                System.out.println(e.getMessage());
            }
        }
    }

}
和客户端类:

bs.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent ke) {

           n1 = Integer.parseInt(tf1.getText());
           n2 = Integer.parseInt(tf2.getText());
           tf1.setText(String.valueOf(n1));
           tf2.setText(String.valueOf(n2));


                  }
   });

      }
        @Override
        public void run() {
            try(Socket clientSocket = new Socket("localhost", 1000);
        DataInputStream in = new DataInputStream(clientSocket.getInputStream());
        DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream()))

            {
    out.write(n1);
    out.write(n2);
    Integer rezultat = in.read();
    tf3.setText(String.valueOf(result));

            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }

        } 
    }
我通过主类和线程启动。
提前谢谢你!:D

您的代码只需要几处更改即可解决此问题:首先,在主代码中,替换

    Thread clientThread = new Thread( new Klijent() );
    clientThread.start();

您希望服务器在后台运行,而不是在按钮事件处理程序中运行代码-服务器应该能够作为单独的程序运行

其次,在
Klijent
构造函数中,删除

    Server s = new Server();
从构造函数中,因为它现在在
main
中完成,并替换

            s.run();

调用客户端的run方法,而不是服务器的run方法


如果分配要求使用客户端线程发出请求,则还可以在按钮事件处理程序中添加第二个线程:

    public void actionPerformed(ActionEvent ke) {
        n1 = ...
        n2 = ...
        new Thread(Klijent.this).start(); // instead of this.run();
    }

哪个
run()
方法-客户端中的方法?如果是,您将如何以及何时启动它?当我运行项目时,会为整数指定默认值0,因为Server类中的run()方法不会等待我输入值并按下按钮。。。我正在通过主类中的线程启动这两个类。问题可能出在您没有发布的代码中。其思想是:服务器只打开一个ServerSocket—一次,而不是在循环中—并在循环中接受连接。如果您在服务器端看到“Client connected”,那么您的客户端已经连接,这意味着客户端中的
run
方法已经执行。我的理解是,您的客户机在2个文本字段之外还有一个按钮,您是否打算在按下该按钮时,联系服务器以执行添加?如果是这种情况,您不希望在
main
中启动客户机线程,而是在按钮按下的事件处理程序中启动。这正是我想要做的。我现在正在研究解决方案。谢谢我已经这样做了。ServerSocket位于run()方法之外,因此它可以在初始化客户端时与客户端连接,但是,我不太确定应该将ServerSocket放在哪里。。。如果我把它放在构造函数中,然后从ActionEvent调用run()方法,那么绑定已经被使用了,因为客户端已经与服务器连接了……非常感谢先生!这终于帮助了我!:)这个程序现在正在运行。我欠你一个人情;)
            run();
    public void actionPerformed(ActionEvent ke) {
        n1 = ...
        n2 = ...
        new Thread(Klijent.this).start(); // instead of this.run();
    }