2010-04-28 1 views
1

를 이해할 수 없다, 나는 reveice : 두 번째 플레이어는 RMI 등록 후RMI-애플릿 - 내가 (유니의 과제를) 쓰고 있어요 간단한 RMI 게임에서 오류 메시지가

 
java.rmi.MarshalException: error marshalling arguments; nested exception is: 
     java.net.SocketException: Broken pipe 
     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:138) 
     at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178) 
     at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) 
     at $Proxy2.drawWorld(Unknown Source) 
     at PlayerServerImpl$1.actionPerformed(PlayerServerImpl.java:180) 
     at javax.swing.Timer.fireActionPerformed(Timer.java:271) 
     at javax.swing.Timer$DoPostEvent.run(Timer.java:201) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

오류 메시지가 나타납니다 서버와 서버는 이미지 (픽셀 배열)를 2 개의 애플릿으로 보내기 시작합니다. PlayerImpl과 PlayerServerImpl은 모두 UnicastRemoteObject를 확장합니다.

저는 지금 다른 오류 메시지로 어려움을 겪고 있지만이 문제를 해결하는 방법을 이해할 수 없습니다. 도와주세요.

코드의 관련 부분

은 다음과 같습니다

PlayerServerImpl.java :


         ... 
     timer = new Timer(10, new ActionListener() { // every 10 milliseconds do: 
      @Override 
      public void actionPerformed(ActionEvent e) { 
         ... 
        BufferedImage buff_image = new BufferedImage(GAME_APPLET_WIDTH, GAME_APPLET_HEIGHT, BufferedImage.TYPE_INT_RGB); 
        // create a graphics context on the buffered image 
        Graphics buff_g = buff_image.createGraphics(); 
         ... 
        // draw the score somewhere on the screen 
        buff_g.drawString(score, GAME_APPLET_WIDTH - 20, 10); 
         ... 
        int[] rgbs = new int[GAME_APPLET_WIDTH * GAME_APPLET_HEIGHT]; 
        int imgPixelsGrabbed[] = buff_image.getRGB(0,0,GAME_APPLET_WIDTH,GAME_APPLET_HEIGHT,rgbs,0,GAME_APPLET_WIDTH); 
        // send the new state to the applets 
        for (Player player : players) { 
         player.drawWorld(imgPixelsGrabbed); 
         System.out.println("Sent image to player"); 
        } 

PlayerImpl.java :


    private PlayerApplet applet;  

    public PlayerImpl(PlayerApplet applet) throws RemoteException { 
     super(); 
     this.applet = applet; 
    } 
     ... 
    @Override 
    public void drawWorld(int[] imgPixelsGrabbed) throws RemoteException { 
     applet.setWorld(imgPixelsGrabbed); 
     applet.repaint(); 
    } 
     ... 

PlayerApplet.java :


     ... 
    private int[] world; // an array of pixels for the new image to be drawn 
     ... 
     // register players 
       player = new PlayerImpl(applet); 
       String serverIPAddressPort = ipAddressField.getText(); 
       if (validateIPAddressPort(serverIPAddressPort)) { 
        server = (PlayerServer) Naming.lookup("rmi://" 
          + serverIPAddressPort + "/PlayerServer"); 
        server.register(player); 
        idPlayer = server.sendPlayerID(); 
     ... 
    @Override 
    public void update(Graphics g) { 
     buff_img = createImage((ImageProducer) new MemoryImageSource(getWidth(), getHeight(), world, 0, getWidth())); 
     Graphics gr = buff_img.getGraphics(); 
     paint(gr); 
     g.drawImage(buff_img, 0, 0, this); 
    } 

    public void setWorld(int[] world) { 
     this.world = world; 
    } 

답변

0

나는 모든 것을 다시 썼다. 동일한 오류 메시지가 여러 번 수신되었으며 네트워크 문제를 나타낼 때마다 받았습니다. 그래서 나는 문제가 해결되었다고 생각한다.

관련 문제