我一直在使用一個簡單的eclipse插件來創建可視狀態機,稱爲statecharts,它也使用Java代碼來工作。我的總體目標是讓兩臺狀態機通過套接字互相通信並交換數據並根據這些數據進行轉換,例如客戶端 - 服務器通信。 在開始時,我使用簡單的同步客戶端 - 服務器代碼,但顯然使用同步方法無法提供幫助;正確的方法是連續輪詢隊列中的數據。我現在試圖使用Java NIO
這似乎很有前途,但不幸的是在第一次嘗試中沒有成功。似乎有一個忙碌的循環,不允許接收到的值觸發更改。代碼很簡單:我首先嚐試連接到服務器(它工作),發送一個數據(它工作),並嘗試從輸入緩衝區讀取每個週期作爲接收數據的一種方式,您可以看到圖片。迄今爲止的邏輯是合理的。我將收到的數據設置爲一個也位於轉換表達式中的變量。所以基本上每當它被設置爲真時,我應該轉換到下一個狀態。但它不起作用。Java中兩個狀態機之間的通信
有人可以幫我解決這個問題嗎?我看到有異步API,如Netty和Naga,如果這是一種補救措施,可能會使事情變得更容易。
這裏是客戶端的代碼:
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);
}
}
}
而且here是Eclipse項目文件夾,您可以簡單地導入,如果該mi要容易些。