2012-12-13 2 views
1

localhost에서 SMACK API 및 OpenFire를 사용하는 간단한 클라이언트를 만들었습니다. 지금은 두 명의 사용자가 X와 Y를 사용하고 있습니다. 누군가가 클라이언트에 로그인 할 때마다 사용자 Y에게 메시지를 보내는 보내기 버튼이 있습니다. XMPP 디버그 관리자를 확인했는데, 메시지를 거기에서받습니다. 그러나 메시지를 표시하기 위해 할당 한 JLabel에 해당 메시지를 표시 할 수 없습니다. 사용자 Y가 보내기 버튼을 누르면 기능에 따라 메시지를 자신에게 보내면 JLabel에 표시됩니다. 그러나 사용자 X가 보내기 단추를 누르면 메시지가 수신되지만 Y의 JLabel에는 표시/업데이트되지 않습니다.Java에서 SMACK API를 사용하여받은 메시지를 표시 할 수 없습니다.

흥미롭게도 모든 것이 gtalk 구성에서와 같이 작동합니다.

WelcomeUser.java : 는 사용자 이름과 암호 프롬프트와 함께 환영 형태는 다음과 같이

구조입니다. 로그인 버튼을 누르는 경우 : ChatBoard 클래스를 표시하도록 설정하고 사용자 이름 암호를 ChatBoard의 생성자에 전달합니다. 코드 :

import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Collection; 

import javax.swing.GroupLayout; 
import javax.swing.GroupLayout.Alignment; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.LayoutStyle.ComponentPlacement; 
import javax.swing.border.EmptyBorder; 

import org.jivesoftware.smack.Chat; 
import org.jivesoftware.smack.ConnectionConfiguration; 
import org.jivesoftware.smack.MessageListener; 
import org.jivesoftware.smack.Roster; 
import org.jivesoftware.smack.RosterEntry; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.packet.Message; 

public class ChatBoard extends JFrame implements MessageListener { 

    private static final long serialVersionUID = 1L; 
    private JPanel contentPane; 
    static String username, password; 
    static XMPPConnection connection; 
    private JTextField textField; 
    static JLabel board = new JLabel(""); 
    static Chat chat; 

    public void sendChat() { 
     try { 
      chat = connection.getChatManager().createChat(
        "[email protected]/Smack", this); 
      chat.sendMessage("Hello, This is " + username); 
     } catch (XMPPException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 


    /** 
    * Create the frame. 
    */ 
    public ChatBoard(String user, String pass) { 

     username = user; 
     password = pass; 

     //// 
        ///JFrame creation code ommited for this thread. 
     // //////////////////////////////////////////// 

     XMPPConnection.DEBUG_ENABLED = true; 

     ConnectionConfiguration config = new ConnectionConfiguration(
       "127.0.0.1"); 


     connection = new XMPPConnection(config); 

     try { 
      connection.connect(); 
      System.out.println("Connected..."); 
     } catch (XMPPException e) { 

      e.printStackTrace(); 
      System.out.println("Not Connected. Error :" + e.getMessage()); 
     } 

     try { 
      connection.login(username, password); 
      System.out.println("Logged in..."); 
     } catch (XMPPException e) { 

      e.printStackTrace(); 
      System.out.println("Not Logged in. Error :" + e.getMessage()); 
     } 

     Roster roster = connection.getRoster(); 
     Collection<RosterEntry> entries = roster.getEntries(); 

     System.out.println("\n\n" + entries.size() + " buddy(ies):"); 
     for (RosterEntry r : entries) { 
      System.out.println(r.getUser()); 
     } 

     // ///////////////////////////////// 

    } 

    @Override 
    public void processMessage(Chat arg0, Message arg1) { 
     // TODO Auto-generated method stub 

     board.setText(board.getText() + arg1.getBody()); 
     System.out.println(arg1.getFrom() + ":" + arg1.getBody().toString()); 

    } 

} 

나는이 새로운, 그래서 어떤 바보 같은 실수가 있다면 용서 : 여기

chBoard=new ChatBoard(username.getText(),password.getText()); 
       chBoard.setVisible(true); 
       setVisible(false); 

는 ChatBoard.java 코드입니다. 귀하의 도움은 정말 감사하겠습니다.

기타 세부 사항 : 로컬 호스트의 SMACK 3.2.2

답변

1

http://www.igniterealtime.org/builds/smack/docs/latest/documentation/messaging.html 하단을보십시오. 다른 사용자가 들어오는 채팅의 경우 ChatManagerListener를 재정의해야합니다.

processMessage에 중단 점을 설정할 수 있으며 해당 중단 점을 맞출 수 있습니까? 그냥 확인하고의 문제가 될 수 있도록하는 경우 :

board.setText() 

Swing event dispatch thread

에서 발생

그래서 만드는 노력이처럼 processMessage를 :

@Override 
public void processMessage(Chat arg0, Message arg1) { 
    // TODO Auto-generated method stub 

    try 
    { 
     SwingUtilities.invokeAndWait(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       board.setText(board.getText() + arg1.getBody()); 
      } 
     }); 
    } 
    catch (InvocationTargetException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    catch (InterruptedException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println(arg1.getFrom() + ":" + arg1.getBody().toString()); 

} 
+0

안녕하십니까. 답장을 보내 주셔서 감사합니다. 나는 당신이 준 코드를 시도했고 똑같은 것이 계속되었다. 사용자 Y가 보내기 버튼을 눌렀을 때만 콘솔 출력을받습니다. 흥미롭게도 gtalk 클라이언트와 통신 할 때 작업 할 때 모든 것이 잘 작동합니다. -/무엇이 잘못되었는지를 알 수 없습니다. – harsh8888

+1

http://www.igniterealtime.org/builds/smack/docs/latest의 맨 아래를보십시오. /documentation/messaging.html. 다른 사용자가 수신하는 채팅의 경우 ChatManagerListener –

+0

안녕 alex를 대체해야합니다. 당신의 도움을 주셔서 감사합니다. 지금 작동 중입니다 :-) – harsh8888

0

나는 chatBoard이 코드를 추가 단지 내 코드에서 언급 한 생성자의 끝에 다음과 같이 작동합니다 :-) Thanks alex.p!

connection.getChatManager().addChatListener(new ChatManagerListener() { 



       public void chatCreated(final Chat chat, final boolean createdLocally) { 

        chat.addMessageListener(new MessageListener() { 



         public void processMessage(Chat chat, Message message) { 

          //JOptionPane.showMessageDialog(null, "Rec: For " + chat.getParticipant() + " from " + message.getFrom() + "\n" + message.getBody()); 

          String sender=message.getFrom(); 

          String senderNames=sender; 

          System.out.println("Received message: " + (message != null ? message.getBody() : "NULL")); 

          board.setText(board.getText()+"\n "+ message.getFrom()+" : "+ message.getBody()); 
          //PrivateChatManager.receiveMessage(sender, senderNames, message.getBody()); 



         } 

        }); 

       } 
     }); 
관련 문제