Как исправить: Anylogic не подключается к Eclipse через Socket - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь создать сценарий на своем Macbook с Mojave в Anylogic, который является частью агентного моделирования с множеством различных инструментов.Моя идея - подключить Anylogic через интерфейс Java к 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 голосов
/ 13 июня 2019

Сам код Java хорош, по крайней мере, для создания простого соединения.Для серверной части в Eclipse вы можете оставить это так.

Для клиентской стороны в AnyLogic, однако, есть проблема: вы не можете запустить код напрямую, так как у вас есть метод mainтам.AnyLogic не является "нормальной" Java IDE, как Eclipse, это очень специфическая IDE.Он автоматически создает вам ровно один проект и помещает туда все, что нужно для его запуска, включая один основной метод.Это означает, что вам не нужен второй основной метод.Скорее, вам нужно сделать так, чтобы ваш клиент стал «частью» более крупной программы, которую AnyLogic создает для вас.Когда вы нажали «Открыть с помощью редактора Java», который только показывал вам код, вы не можете запустить любой подобный код в AnyLogic!

Поэтому мы делаем следующие шаги:

  1. Создатькласса Java (простой, без основного метода) Client в AnyLogic
  2. Добавить функцию в класс для запуска клиентской процедуры (до того, как она была запущена собственным основным методом)
  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;

}

Создание экземпляра и активация клиента могут бытьсделайте с этим кодом, добавьте его, например, кнопкой или кодом OnStartup основного агента AnyLogic:

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

button

...