如何修复:Anylogic 无法通过 Socket 连接到 Eclipse

How to fix: Anylogic does not connect to Eclipse over Socket

我正在尝试使用 Anylogic 中的 Mojave 在我的 Macbook 上创建一个场景,这是使用许多不同工具的基于代理的模拟的一部分。我的想法是通过 Java 接口将 Anylogic 连接到 Eclipse。 主要问题是,Anylogic 以某种方式没有响应。

我已经尝试过许多不同的套接字代码,但找不到一个适用于 Anylogic 的代码。我正在使用 Anylogic 的免费版本,并在我的主项目下创建了一个 Java 界面。要 运行 Java 界面,我右键单击该文件,然后 select 'run with Java Editor'

与此相比,我在 Eclipse 中创建了两个文件,一个是服务器,一个是客户端,它工作正常。

所以这是我的 Eclipse,我想应该没问题https://www.minpic.de/i/7wbk/nv00b

这是我在 Anylogic 中的主要模型 https://www.minpic.de/i/7wbn/pzuut

还有Java接口,里面有服务器代码。 https://www.minpic.de/i/7wbo/1mxsl4

我对编码还很陌生,所以希望你们能帮助我。


public class server{
    public static void main(String[] args) throws IOException {
    ServerSocket ss = new ServerSocket(4995);
    Socket s = ss.accept();

    System.out.println("Client connected");
    DataInputStream dout = new DataInputStream(s.getInputStream());
    BufferedReader br = new BufferedReader (new InputStreamReader (System.in));
    while(true) {
        String yoo = dout.readUTF();
        System.out.println("client" + yoo);
        if(yoo.equalsIgnoreCase("exit"));
        break;
    }
    ss.close();

    }   
}


public class client{
    public static void main(String[] args) throws IOException {
    Socket s = new Socket("localhost",4995);
    DataOutputStream dout = new DataOutputStream(s.getOutputStream());
    BufferedReader br = new BufferedReader (new InputStreamReader (System.in));
    while (true)
    {
        String so= br.readLine();
        dout.writeUTF(so);
        System.out.println("client" + so);
        if(so.equalsIgnoreCase("exit"));
        break;
    }
    s.close();
        }
    }

我希望这两个程序的控制台都能显示我通过控制台发送的消息,但是这两个程序都没有显示我在另一个程序中编写的消息。

Java 代码本身没有问题,至少对于创建简单的连接来说是这样。 对于 Eclipse 中的服务器端,您可以保留它。

然而,对于 AnyLogic 中的客户端,存在一个问题: 你不能像这样直接 运行 代码,因为你在那里有一个 main 方法。 AnyLogic不像Eclipse那样"normal"JavaIDE,它是一个非常具体的IDE。它会自动为您创建一个项目,并将 运行 它所需的一切都放在那里,包括一个主要方法。这意味着您不需要第二个主要方法。您宁愿让您的客户成为 AnyLogic 为您构建的更大程序的 "part"。当您单击仅向您显示代码的 "Open with Java Editor" 时,您无法在 AnyLogic 中 运行 任何类似的代码!

因此我们执行以下步骤:

  1. 在 AnyLogic
  2. 中创建 Java class(一个简单的,没有 main 方法)Client
  3. 向 class 添加函数以启动客户端程序(在它被自己的 main 方法触发之前)
  4. 从 Class Client
  5. 创建实例

class代码,已经包含的功能如下:

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Client implements Serializable {

    public Client() {
    }

    public void activate() {
        try {
        Socket s = new Socket("localhost",4995);
        DataOutputStream dout = new DataOutputStream(s.getOutputStream());
        BufferedReader br = new BufferedReader (new InputStreamReader (System.in));
        while (true)
        {
            String so= br.readLine();
            dout.writeUTF(so);
            System.out.println("client" + so);
            if(so.equalsIgnoreCase("exit"));
            break;
        }
        s.close();
        }
        catch(IOException e) {
            System.out.println(e);
        }
    }

    /**
     * This number is here for model snapshot storing purpose<br>
     * It needs to be changed when this class gets changed
     */ 
    private static final long serialVersionUID = 1L;

}

可以使用此代码创建实例并激活客户端,例如将其添加到按钮或 AnyLogic 主代理的 OnStartup 代码中:

Client client = new Client();
client.activate();