如何解决:Anylogic无法通过Socket连接到Eclipse

时间:2019-06-07 15:43:37

标签: java sockets interface connection anylogic

我正在尝试使用Anylogic中的Mojave在Macbook上创建方案,这是使用许多不同工具的基于代理的仿真的一部分。我的想法是通过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();
        }
    }

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

1 个答案:

答案 0 :(得分:0)

Java代码本身很好,至少可以用于创建简单的连接。 对于Eclipse中的服务器端,您可以像这样保留它。

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

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

  1. 在AnyLogic中创建Java类(一个简单的类,没有main方法)Client
  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();

Button