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