运行() 方法未等待数据输入
run() method is not waiting for data input
我正在尝试创建一个应用程序,您可以在其中输入两个数字,这些数字会被解析并通过 TCP 协议发送到服务器,然后添加、返回并设置为 TextField。问题是,与 BufferedReader 流不同,运行() 方法不等待输入数字。我目前正在使用 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());
}
}
}
}
和客户class:
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());
}
}
}
我同时通过主 class 和线程启动。
先感谢您! :D
您的代码只需要进行一些更改即可解决此问题:首先,在您的主代码中,替换
Thread clientThread = new Thread( new Klijent() );
clientThread.start();
和
Thread serverThread = new Thread( new Server() );
serverThread.start();
new Klijent();
您需要后台的服务器,而不是 运行 按钮事件处理程序中的代码 - 服务器应该能够 运行 作为一个单独的程序。
其次,在Klijent
构造函数中,移除
Server s = new Server();
来自构造函数,因为它现在在 main
中完成,并替换
s.run();
和
run();
调用客户端的 运行 方法,而不是服务器的方法。
如果作业要求使用客户端线程发出请求,您还可以在按钮事件处理程序中添加第二个线程:
public void actionPerformed(ActionEvent ke) {
n1 = ...
n2 = ...
new Thread(Klijent.this).start(); // instead of this.run();
}
我正在尝试创建一个应用程序,您可以在其中输入两个数字,这些数字会被解析并通过 TCP 协议发送到服务器,然后添加、返回并设置为 TextField。问题是,与 BufferedReader 流不同,运行() 方法不等待输入数字。我目前正在使用 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());
}
}
}
}
和客户class:
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());
}
}
}
我同时通过主 class 和线程启动。 先感谢您! :D
您的代码只需要进行一些更改即可解决此问题:首先,在您的主代码中,替换
Thread clientThread = new Thread( new Klijent() );
clientThread.start();
和
Thread serverThread = new Thread( new Server() );
serverThread.start();
new Klijent();
您需要后台的服务器,而不是 运行 按钮事件处理程序中的代码 - 服务器应该能够 运行 作为一个单独的程序。
其次,在Klijent
构造函数中,移除
Server s = new Server();
来自构造函数,因为它现在在 main
中完成,并替换
s.run();
和
run();
调用客户端的 运行 方法,而不是服务器的方法。
如果作业要求使用客户端线程发出请求,您还可以在按钮事件处理程序中添加第二个线程:
public void actionPerformed(ActionEvent ke) {
n1 = ...
n2 = ...
new Thread(Klijent.this).start(); // instead of this.run();
}