2013-12-11 4 views
0

저는 학교 프로젝트를 진행하고 있습니다. 우리는 당신이 선박을 적재하거나 하역 할 수있는 항구를 만들고 있습니다. 컨트롤 부분은 Netbeans이고 시뮬레이션은 JME입니다. Netbeans에서 소켓을 통해 JME으로 데이터를 전송합니다. JME는 Netbeans에서 입력에 접속하는 서버 소켓을 실행 중입니다.jmonkey와 netbeans 간의 연결

예를 들어 Netbeans은 컨테이너의 ID를 보내고 JME에있는 크레인은 그 컨테이너를 가져 와서 해안에 올려 놓습니다.

SimpleUpdate에서 메소드를 호출 할 수 있도록 주 (Main.count = 2)의 수를 변경합니다. 문제는 때로는 물건을 건너 뛰는 것입니다. 또한 나는 컨테이너를 가져 오는 차량과 같은 더 많은 정보를 보낼 때 상황이 점점 악화되고 있다고 생각합니다. 이 문제를 어떻게 해결할 수 있습니까? 좋은 연결 고리를 얻을 수있는 다른 방법이 있습니까?

코드 :

넷빈즈

클라이언트 보내기

public static void run() throws Exception 
{  
    Socket socket = new Socket("Localhost", 4321);  
    out = new ObjectOutputStream(socket.getOutputStream());  
} 

//Sent arraystring to Simulation 
public void sent(String sentString){ 
    try { 
     out.writeObject(sentString); 
    } catch (IOException ex) { 
     Logger.getLogger(CommunicationWithSimulatoin.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

주요 몇 가지 물건의 예를 보낼

for(int i = Calculator.getContainersFromMaritime(); i > 1; i--) 
{ 
    Thread.sleep(50); 
    sim.sent("craneCon;" + i + ";"); 
    System.out.println(i);    
} 

JME

리스너

public static void Listener() throws Exception { 
    boolean isRunning = true; 
    //Creates the server socket 
    ServerSocket sSocket = new ServerSocket(4321); 
    //Acception a connection from the client 

    Socket socket = sSocket.accept(); 
    ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); 
    //Get the input from the client 

    while (isRunning) { 
     //Reads and prints the input 
     test = (String) in.readObject(); 
     System.out.println(test); 
     String[] parts = receivedString.split(";"); 

     if(parts[0].equals("ContainerPositionsMaritime")) 
     { 
      Maritime.ContainersOnBoard = receivedString.split(";"); 
      Main.count = 0; 
     } 
     if(parts[0].equals("craneCon")) 
     { 
      int containerId = Integer.parseInt(parts[1]); 
      SeagoingCranes.idContainer = containerId; 
      Main.count = 2; 
     } 
    } 
} 

홈페이지 simpleupdate

public void simpleUpdate(float tpf) { 
    if(count == 0) 
    { 
     InitContainers(); 
     //martime.setLocalTranslation(0, 500.0f, 0); 
     count = 999; 
    } 
    if(count == 2) 
    { 
     InitCrane(SeagoingCranes.idContainer); 
     count = 999; 
    } 
    if(martime != null) 
    { 
     martime.move(0,0,0.25f*tpf); 
    } 
} 
+0

컨트롤이 netbeans에 있다는 것은 무엇을 의미합니까? netbeans에서 간단한 응용 프로그램을 실행하고 있다는 것을 의미합니까? –

+0

컨트롤을 사용하면 JME 부품이 컨테이너를 가져 오거나 그 차량을 그 장소로 보내고 그 컨테이너를 픽업하는 것과 같은 조치를 취해야한다는 것을 의미합니다. –

+0

이 질문에 답할 수는 없지만 netbeans는 IDE 일 뿐이며 프로그램의 일부는 아닙니다. 그것은 당신이 –

답변

0

프로그램 문제에는 여러 가지가 있습니다.

우선, 당신은 하나의 스레드에서 수정되고 다른 스레드에서 읽히는 SimpleApplication 내부의 정수 값이라고 가정하고 "카운트"할 때 잠재적 인 경쟁 및 스레드 경쟁 문제가 있습니다. 값이 휘발성으로 선언되지 않으면 모든 종류의 예상치 못한 문제와 이상한 동작이 발생할 수 있으며 휘발성으로 선언하는 경우조차 권장하지 않습니다.

중요한 문제 (제쳐두고 미묘한 문제는 떠나기도 함)는 simpleUpdate()에서 검색 횟수를 기준으로 작업을 수행한다는 사실 때문에 발생합니다. simpleUpdate()은 jME3 애플리케이션이 실행 중일 때 각 프레임마다 한 번 호출됩니다.

프레임에 메시지를 두 개 이상받는 경우 다음 번에 simpleUpdate()이 실행되기 전에 카운트가 다시 수정되므로 마지막 메시지 만 처리됩니다.

가장 좋은 방법은 app.enqueue()입니다.

 if(parts[0].equals("ContainerPositionsMaritime")) 
     { 
      final ContainersOnBoard containers = receivedString.split(";"); 
      mainApp.enqueue(new Callable<Spatial>() { 
       public Spatial call() throws Exception { 
        mainApp.InitContainers(containers); 
        return null; 
       } 
      });     
      } 

     } 

simpleUpdate()에서 기존 코드를 모두 제거 할 수 있습니다.

enqueue은 다음 업데이트에서 JME3 스레드에서 다시 호출되어 컨테이너 추가 처리됩니다. 모든 다른 명령에 대해 비슷한 작업을 수행하면 enqueue이되고 시간이 지남에 따라 모든 명령을 처리합니다. enqueue을 원하는만큼 많은 명령으로 처리 할 수 ​​있으며 모두 처리됩니다.

일반적으로 AppStates, 컨트롤 및 스레딩 모델을 읽어야합니다. 코드를 훨씬 체계적이고 체계적으로 만들 수 있습니다.

http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:multithreading

http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:application_states

http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:custom_controls

P.S. Java 스타일/코딩 규칙을 따라야합니다. 예를 들어 메소드는 소문자로 시작해야합니다. initContainers는 InitContainers가 아닙니다.

+0

답장을 보내 주셔서 감사합니다! 나는이 일을 할 것이다 :). 나는 대개 소문자를 사용하지만 그룹에서 일하고 있고 모든 사람들이 그걸 사용하고있는 것은 아닙니다. –