2010-05-28 7 views
1

J'essaye de faire fonctionner un serveur de chat de servlet SIP, together with the textclient found here.Servlets SIP, serveur de chat

Lorsque j'utilise 2 clients pour envoyer des messages les uns aux autres (pair à pair), tout se passe bien. Mais lorsque j'utilise un ou plusieurs clients avec mon serveur, je dois attendre exactement 32 secondes avant que le serveur ne récupère de nouveaux messages dans la méthode doMessage(). J'utilise NetBeans avec Sailfin comme serveur SIP. Y at-il une sorte de limitation ou de délai configurable ou de délai entre les demandes ou les réponses dans Sailfin que je regarde?

Je peux publier le code du serveur, si nécessaire.

Merci

Répondre

0

Pour répondre à ma propre question, si jamais quelqu'un rencontre le même problème, je l'ai trouvé ce bogue dans la textclient contre la section suivante 8.1.1.7 de la RFC 3261.

La valeur du paramètre de dérivation doit être unique à travers l'espace et le temps pour tous demandes envoyées par l'UA.Les exceptions à cette règle sont CANCEL et ACK pour les réponses non-2xx. Comme discuté ci-dessous, une demande CANCEL aura la même valeur du paramètre de branche que la demande annule. Comme indiqué à la Section 17.1.1.3, un ACK pour une réponse non-2xx aura également le même ID de branche que l'INVITE dont il reconnaît la réponse.

La propriété unique de la branche paramètre d'identification, afin de faciliter son utilisation en tant un ID de transaction, ne faisait pas partie de la RFC 2543.

L'ID de dérivation insérée par un élément conforme à la présente spécification doit Commencez toujours par les caractères "z9hG4bK".

La ligne suivante dans SipLayer.java

ViaHeader viaHeader = headerFactory.createViaHeader(getHost(), 
getPort(), "udp", "branch1"); 

Créera chaque message avec le paramètre "Branch1". Rendre ce paramètre unique résout le problème.

1

32 secondes est le délai normal pour les transactions (notée 64 * T1 dans RFC3261, où la valeur par défaut pour T1 est 500ms.)

Je ne sais pas directement une solution à votre problème, sauf que le timeout n'est très probablement PAS une mauvaise configuration dans SailFin. Veuillez donc fournir une trace de wireshark et le code du serveur!

2

Voici le code du serveur, je vais essayer de faire une trace de wireshark plus tard.

public class ChatroomSipServlet extends SipServlet { 

    public final static String USER_LIST = "userList"; 

    public final static String CHATROOM_SERVER_NAME = "chatroomservername"; 

    public String serverAddress; 
    public SipFactory factory; 

    @Override 
    public void init(ServletConfig servletConfig) throws ServletException { 
     super.init(servletConfig); 
     System.out.println("Chatroom sip servlet is gestart!"); 
     try { 
      factory = (SipFactory) getServletContext().getAttribute("javax.servlet.sip.SipFactory"); 
      System.out.println("Sip Factory: " + factory); 
     } catch (Exception e) { 
      throw new ServletException("Factory probleem!", e); 
     } 
     getServletContext().setAttribute(USER_LIST, new ArrayList<String>()); 
     serverAddress = getServletConfig().getInitParameter(CHATROOM_SERVER_NAME); 
     System.out.println("serverAddress is: " + serverAddress); 
    } 

    @Override 
    public void destroy() { 
     try { 
      sendToAll(serverAddress, "Server sluit af!"); 
     } catch (Throwable e) { 

      e.printStackTrace(); 
     } 
     super.destroy(); 
    } 

    protected void doMessage(SipServletRequest request) throws ServletException, IOException { 

     System.out.println(getDateTime() + " Bericht ontvangen"); 

     request.createResponse(SipServletResponse.SC_OK).send(); 

     String message = request.getContent().toString(); 
     String from = ((SipURI) request.getFrom().getURI()).toString(); 

     if (message.equalsIgnoreCase("/quit")) { 
      sendToUser(from, "Bye"); 
      removeUser(from); 
      return; 
     } 

     if (!containsUser(from)) { 
      sendToUser(from, "Welkom in de chatroom. Typ '/quit' om af te sluiten."); 
      addUser(from); 
     } 

     if (message.equalsIgnoreCase("/who")) { 
      String users = "Lijst van de gebruikers:\n"; 
      List<String> list = (List<String>) getServletContext().getAttribute(USER_LIST); 
      for (String user : list) { 
       users += user + "\n"; 
      } 
      sendToUser(from, users); 
      return; 
     } 

     if (message.equalsIgnoreCase("/join")) { 
      return; 
     } 

     sendToAll(from, message); 
    } 

    protected void doErrorResponse(SipServletResponse response) throws ServletException, IOException { 

//  String receiver = response.getTo().toString(); 
     String receiver = ((SipURI) response.getTo().getURI()).toString(); 
     System.out.println(getDateTime() + " Errorresponse voor " + receiver); 
     removeUser(receiver); 
    } 

    protected void doSuccessResponse(SipServletResponse response) throws ServletException, IOException { 

     response.getApplicationSession().invalidate(); 
    } 

    private void sendToAll(String from, String message) throws ServletParseException, IOException { 

     List<String> list = (List<String>) getServletContext().getAttribute(USER_LIST); 
     for (String user : list) { 
      SipApplicationSession session = factory.createApplicationSession(); 
      System.out.println(getDateTime() + " Session created voor " + user); 
      SipServletRequest request = factory.createRequest(session, "MESSAGE", serverAddress, user); 
      String msg = from + " stuurt: \n" + message; 
      request.setContent(msg.getBytes(), "text/plain"); 
      request.send(); 
     } 
    } 

    private void sendToUser(String to, String message) throws ServletParseException, IOException { 

     SipApplicationSession session = factory.createApplicationSession(); 
     SipServletRequest request = factory.createRequest(session, "MESSAGE", serverAddress, to); 
     request.setContent(message.getBytes(), "text/plain"); 
     request.send(); 
    } 

    private boolean containsUser(String from) { 
     List<String> list = (List<String>) getServletContext().getAttribute(USER_LIST); 
     return list.contains(from); 
    } 

    private void addUser(String from) { 
     List<String> list = (List<String>) getServletContext().getAttribute(USER_LIST); 
     list.add(from); 
    } 

    private void removeUser(String from) { 
     System.out.println(getDateTime() + " " + from + " wordt verwijderd uit de lijst."); 
     List<String> list = (List<String>) getServletContext().getAttribute(USER_LIST); 
     list.remove(from); 

    } 

    @Override 
    protected void doRegister(SipServletRequest req) throws ServletException, IOException { 
     System.out.println("Register request ontvangen: " + req.getTo()); 
     int response = SipServletResponse.SC_OK; 
     SipServletResponse resp = req.createResponse(response); 
     resp.send(); 
    } 

    private String getDateTime() { 
     DateFormat dateFormat = new SimpleDateFormat("[" + "HH:mm:ss" + "]"); 
     Date date = new Date(); 
     return dateFormat.format(date); 
    } 
} 

Et le sip.xml

<sip-app> 
    <app-name>sip.chatvoorbeeld.ChatServer</app-name> 
    <display-name>Chatroom Sip Servlet</display-name> 
    <description>Chatroom Sip Servlet</description> 

    <servlet-selection> 
     <main-servlet> 
      ChatroomSipServlet 
     </main-servlet> 
    </servlet-selection> 
    <session-config> 
     <session-timeout>5</session-timeout> 
    </session-config> 

    <servlet> 
     <servlet-name>ChatroomSipServlet</servlet-name> 
     <display-name>ChatroomSipServlet</display-name> 
     <description>Chatroom SIP servlet</description> 
     <servlet-class> 
      sip.chatvoorbeeld.ChatroomSipServlet 
     </servlet-class> 
     <init-param> 
      <param-name>chatroomservername</param-name> 
      <param-value>sip:[email protected]:5060</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
</sip-app> 

J'ai essayé aussi un servlet vide, juste avec une méthode doMessage() qui se contente d'afficher "message reçu". Même délai de 32 secondes ...

Wireshark me donne:

J'envoie le message "test" au serveur:

MESSAGE sip:[email protected]:5060;transport=udp SIP/2.0 
Call-ID: [email protected] 
CSeq: 1 MESSAGE 
From: "bobby" <sip:[email protected]:5095>;tag=textclientv1.0 
To: "chatserver" <sip:[email protected]:5060> 
Via: SIP/2.0/UDP 192.168.56.101:5095;branch=branch1 
Max-Forwards: 70 
Contact: "bobby" <sip:[email protected]:5095> 
Content-Type: text/plain 
Content-Length: 4 

test 

serveur renvoie:

SIP/2.0 200 OK 
Content-Length: 0 
To: "chatserver"<sip:[email protected]:5060>;tag=g9vdns7u-e 
Cseq: 1 MESSAGE 
Via: SIP/2.0/UDP 192.168.56.101:5095;branch=branch1 
From: "bobby"<sip:[email protected]:5095>;tag=textclientv1.0 
Call-Id: [email protected] 
Server: Glassfish_SIP_2.0.0 

MESSAGE sip:[email protected]:5095 SIP/2.0 
Max-Forwards: 69 
Content-Length: 43 
To: <sip:[email protected]:5095> 
Cseq: 1 MESSAGE 
Via: SIP/2.0/UDP 192.168.56.1:5060;branch=z9hG4bKdaacb7673c871796474ca951221a6643db6c 
Content-Type: text/plain 
Call-Id: 192.168.56.1_11_6595680936174578736 
From: <sip:[email protected]:5060>;tag=g9vdns7u-g 

sip:[email protected]:5095 stuurt: 
test 

Ensuite, mon le client répond encore avec un OK:

SIP/2.0 200 OK 
To: <sip:[email protected]:5095>;tag=888 
CSeq: 1 MESSAGE 
Via: SIP/2.0/UDP 192.168.56.1:5060;branch=z9hG4bKdaacb7673c871796474ca951221a6643db6c;received=192.168.56.1 
Call-ID: 192.168.56.1_11_6595680936174578736 
From: <sip:[email protected]:5060>;tag=g9vdns7u-g 
Content-Length: 0 

Jusqu'ici, tout va bien. Mais maintenant, j'envoyer un second message au serveur "test2" et je reçois ceci:

client au serveur:

MESSAGE sip:[email protected]:5060;transport=udp SIP/2.0 
Call-ID: [email protected] 
CSeq: 1 MESSAGE 
From: "bobby" <sip:[email protected]:5095>;tag=textclientv1.0 
To: "chatserver" <sip:[email protected]:5060> 
Via: SIP/2.0/UDP 192.168.56.101:5095;branch=branch1 
Max-Forwards: 70 
Contact: "bobby" <sip:[email protected]:5095> 
Content-Type: text/plain 
Content-Length: 5 

test2 

Ensuite, le serveur ne répond avec:

SIP/2.0 200 OK 
Content-Length: 0 
To: "chatserver"<sip:[email protected]:5060>;tag=g9vdns7u-e 
Cseq: 1 MESSAGE 
Via: SIP/2.0/UDP 192.168.56.101:5095;branch=branch1 
From: "bobby"<sip:[email protected]:5095>;tag=textclientv1.0 
Call-Id: [email protected] 
Server: Glassfish_SIP_2.0.0 

Mais la communication s'arrête ... Je reçois un 200 OK, mais le println() dans ma méthode doMessage() n'est pas passé.