我一直在使用一个简单的 Eclipse 插件来创建可视状态机,称为statecharts,它也使用 Java 代码来工作。我的总体目标是让两个状态机通过套接字相互通信并交换数据并在此基础上进行转换,例如客户端-服务器通信。一开始我使用的是简单的同步客户端-服务器代码,但显然使用同步方法无济于事;正确的方法是不断地从队列中轮询数据。我现在正在尝试使用Java NIO
这似乎很有希望,但不幸的是第一次尝试没有成功。似乎某处有一个繁忙的循环,不允许接收到的值触发更改。
代码非常简单:我首先尝试连接到服务器(有效),发送数据(有效),并尝试在每个周期从输入缓冲区中读取数据,以此作为接收数据的一种方式,如图所示。到目前为止的逻辑是有道理的。我将接收到的数据设置为也位于转换表达式中的变量。所以基本上只要它设置为真,我就应该转换到下一个状态。但它不起作用。
有人可以帮我解决这个问题吗?我已经看到有像Netty和Naga这样的异步 API,如果这是一种补救措施,它们可能会使事情变得更容易。
这是客户端的代码:
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class EchoClient2 {
String serverHostname = new String("127.0.0.1");
BufferedReader stdIn;
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
public void open(){
System.out.println("Attemping to connect to host " + serverHostname
+ " on port 5555.");
try {
echoSocket = new Socket(serverHostname, 5555);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + serverHostname);
} catch (IOException e) {
System.err.println("Couldn't get I/O for " + "the connection to: "
+ serverHostname);
}
}
public void send(){
String userInput = "1";
out.println(userInput);
}
public String receive(){
String result = "";
try {
result = in.readLine();
if(result==null)
return "0";
} catch (IOException e) {
}
return result;
}
}
这是服务器的代码:
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer extends Thread {
protected Socket clientSocket;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(5555);
System.out.println("Connection Socket Created");
try {
while (true) {
System.out.println("Waiting for Connection");
new EchoServer(serverSocket.accept());
}
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
} catch (IOException e) {
System.err.println("Could not listen on port: 5555.");
System.exit(1);
} finally {
try {
serverSocket.close();
} catch (IOException e) {
System.err.println("Could not close port: 5555.");
System.exit(1);
}
}
}
private EchoServer(Socket clientSoc) {
clientSocket = clientSoc;
start();
}
public void run() {
System.out.println("New Communication Thread Started");
try {
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
true);
BufferedReader in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Server: " + inputLine);
out.println(inputLine);
if (inputLine.equals("Bye."))
break;
}
out.close();
in.close();
clientSocket.close();
} catch (IOException e) {
System.err.println("Problem with Communication Server");
System.exit(1);
}
}
}
这里是 Eclipse 项目文件夹,如果这可能更容易,您可以简单地导入它。