首页 > 解决方案 > 如何修复:Anylogic 无法通过 Socket 连接到 Eclipse

问题描述

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

我用套接字尝试了许多不同的代码,但找不到适用于 Anylogic 的代码。我正在使用 Anylogic 的免费版本,并在我的主项目下创建了一个 Java 接口。要运行 Java 界面,请右键单击该文件并选择“使用 Java 编辑器运行”

与此相比,我在 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();
        }
    }

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

标签: javasocketsinterfaceconnectionanylogic

解决方案


Java 代码本身很好,至少对于创建一个简单的连接来说是这样。对于 Eclipse 中的服务器端,您可以这样。

然而,对于 AnyLogic 中的客户端,存在一个问题:您不能像这样直接运行代码,因为那里有一个 main 方法。AnyLogic 不是像 Eclipse 那样的“普通”Java IDE,它是一个非常特殊的 IDE。它会自动为您创建一个项目,并将运行它所需的所有内容放入其中,包括一个主要方法。这意味着您不需要第二个主要方法。您宁愿让您的客户成为 AnyLogic 为您构建的更大程序的“一部分”。当您单击仅显示代码的“使用 Java 编辑器打开”时,您无法在 AnyLogic 中运行任何类似的代码!

因此,我们执行以下步骤:

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

已经包含函数的类代码如下:

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();

按钮


推荐阅读