关于jain-sip和sip servlet有几个疑问!一、jain-sip:
    1、如果做一个GUI的sip server是否需要用到线程呢?我写了一个简单的转发例子,没用到线程,也实现了!可我总是觉得不放心。    2、对于sip的响应messageFactory.createResponse(200, req),这里面的200代表什么,为什么一定要用200?    3、toHeader.setTag("999")的999是否只是一个用户随便定义的标记!
 
    4、响应里是否也可以有消息内容呢?    5、针对不同的请求,例如:ack,invit,message等的请求,响应是不是需要用不同的方式!如果需要,怎么响应呢?二、sip servlet:    1、网上SIP简介,第2部分:SIP SERVLET里面聊天室服务端的例子,配置的WEB.XML总是报错,提示http://www.jcp.org/dtd/sip-app_1_0.dtd找不到!我想可能是我的web容器有问题,我用websphere做的服务器,可是BEA发布的weblogic sip server无法添加到eclipse里,你们是怎么解决的。    2、加入上面的sipservlet发布成功,那客户端怎么请求服务端呢?原码里没有定义服务器名称和端口号,它是怎么侦听的呢?

解决方案 »

  1.   

    补充个问题,用sip传递中文的String会出现乱码,怎么解决!
      

  2.   

    水平有限
    但是帮你顶下!
    UP
    UP UP
      

  3.   

    是否看的是别人的程序? 如果是, 可能有些参数给原来的程序员写死了.到Servlet应该和jain-sip协议层关系不大了, 我想是用作一个例子而已吧. 多看看servlet可能对你有帮助
      

  4.   

    关于jain-sip和sip servlet有几个疑问!一、jain-sip:
        1、如果做一个GUI的sip server是否需要用到线程呢?我写了一个简单的转发例子,没用到线程,也实现了!可我总是觉得不放心。
    //JAIN-SIP支持多线程的配置。
        2、对于sip的响应messageFactory.createResponse(200, req),这里面的200代表什么,为什么一定要用200?
    //看看RFC3261,200表示一个最终应答,就像发个http request过去,web容器给个200应答一样
        3、toHeader.setTag("999")的999是否只是一个用户随便定义的标记!
     //tag是有实际意义的,比如同一ip上的多台server,就可以靠tag来区分等
        4、响应里是否也可以有消息内容呢?
    //应答也可以有消息内容,附在sdp body里
        5、针对不同的请求,例如:ack,invit,message等的请求,响应是不是需要用不同的方式!如果需要,怎么响应呢?
    //参看invite事务和普通的事务(RFC3261)
    二、sip servlet:    1、网上SIP简介,第2部分:SIP SERVLET里面聊天室服务端的例子,配置的WEB.XML总是报错,提示http://www.jcp.org/dtd/sip-app_1_0.dtd找不到!我想可能是我的web容器有问题,我用websphere做的服务器,可是BEA发布的weblogic sip server无法添加到eclipse里,你们是怎么解决的。
    //没用过bea的sip容器,不知道它是怎么用的
        2、加入上面的sipservlet发布成功,那客户端怎么请求服务端呢?原码里没有定义服务器名称和端口号,它是怎么侦听的呢?
    //客户端可以是sip终端,直接发一个sip请求过来,如果sip容器受到了则会调用相应的servlet。当然这个sip请求也可能是通过http的方式间接触发的。
      

  5.   

    感谢liaoxingya276(独孤过客) 的回答,还有几个疑问1、JAIN-SIP支持多线程的配置。
    //那我写服务端的时候还用起线程吗?
    2、能否给给推荐一个sip servlet的服务器!3、客户端可以是sip终端,直接发一个sip请求过来,如果sip容器受到了则会调用相应的servlet。当然这个sip请求也可能是通过http的方式间接触发的。
    //sip请求的地址怎么写呢?因为服务端没有指明端口号!
      

  6.   

    补充个问题,用sip传递中文的String会出现乱码,怎么解决!
      

  7.   

    感谢liaoxingya276(独孤过客) 的回答,还有几个疑问1、JAIN-SIP支持多线程的配置。
    //那我写服务端的时候还用起线程吗?////JAIN-SIP支持多线程就像tomcat支持多线程一样,应用不需要关心,如果应用侧有比较耗时的不需要同步的操作,还是要用线程的
    2、能否给给推荐一个sip servlet的服务器!////bea的不行吗?
    3、客户端可以是sip终端,直接发一个sip请求过来,如果sip容器受到了则会调用相应的servlet。当然这个sip请求也可能是通过http的方式间接触发的。
    //sip请求的地址怎么写呢?因为服务端没有指明端口号!
    ////如果服务端不指明端口号,客户端怎么知道把消息发到哪里去??端口号是一定要指明的。
      

  8.   

    出现的乱码问题是不是用了JAIN-sip?
    据我的推测,可能是JAIN-SIP的parser不支持中文
      

  9.   

    JAIN-SIP性能很差,建议优化后再使用
      

  10.   

    to:liaoxingya276(独孤过客) package dev2dev.chatroomserver;import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.sip.Address;
    import javax.servlet.sip.ServletParseException;
    import javax.servlet.sip.SipApplicationSession;
    import javax.servlet.sip.SipFactory;
    import javax.servlet.sip.SipServlet;
    import javax.servlet.sip.SipServletMessage;
    import javax.servlet.sip.SipServletRequest;
    import javax.servlet.sip.SipServletResponse;public class ChatRoomServer extends SipServlet {
        
        /** Context attribute key to store user list. */
        public static String THE_LIST="dev2dev.chatroomserver.userList";
        
        /** Init parameter key to retrieve the chatroom's address. */
        public static String THE_NAME="dev2dev.chatroomserver.name";    /** This chatroom server's address, retrieved from the init params. */
        public String serverAddress;
        
        /** This is called by the container when starting up the service. */
        public void init() throws ServletException {
            super.init();
            getServletContext().setAttribute(THE_LIST,new ArrayList());
            serverAddress = getServletConfig().getInitParameter(THE_NAME);
        }    /** This is called by the container when shutting down the service. */
        public void destroy() {
            try
            {
                sendToAll(serverAddress, "Server is shutting down -- goodbye!");
            } catch (Throwable e)
            { //ignore all errors when shutting down.
                e.printStackTrace();
            }
            super.destroy();
        }    /** This is called by the container when a MESSAGE message arrives. */
        protected void doMessage(SipServletRequest request) throws 
                ServletException, IOException {        request.createResponse(SipServletResponse.SC_OK).send();                    String message = request.getContent().toString();
            String from = request.getFrom().toString();
            
            //A user asked to quit.
            if(message.equalsIgnoreCase("/quit")) {
                sendToUser(from, "Bye");
                removeUser(from);
                return;
            }
            
            //Add user to the list
            if(!containsUser(from)) {
                sendToUser(from, "Welcome to chatroom " + serverAddress + 
                        ". Type '/quit' to exit.");
                addUser(from);
            }        if(message.equalsIgnoreCase("/who")) {
                String users = "List of users:\n";
                List list = (List)getServletContext().getAttribute(THE_LIST);
                Iterator iter = list.iterator();
                while (iter.hasNext())
                {
                    String user = (String) iter.next();
                    users += user + "\n";
                }
                sendToUser(from, users);
                removeUser(from);
                return;
            }        //If the user is joining the chatroom silently, no message 
            //to broadcast, return. 
            if(message.equalsIgnoreCase("/join")) {
                return;
            }
            
            //We could implement more IRC commands here, 
            //see http://www.mirc.com/cmds.html
            sendToAll(from, message);
    }    /** 
         * This is called by the container when an error is received 
         * regarding a sent message, including timeouts. 
         */
        protected void doErrorResponse(SipServletResponse response)
                throws ServletException, IOException {
            super.doErrorResponse(response);
            //The receiver of the message probably dropped off. Remove 
            //him from the list.
            String receiver = response.getTo().toString();
            removeUser(receiver);
        }    /**
         * This is called by the container when a 2xx-OK message is 
         * received regarding a sent message. 
         */
        protected void doSuccessResponse(SipServletResponse response)
                throws ServletException, IOException {
            super.doSuccessResponse(response);
            //We created the app session, we have to destroy it too.
            response.getApplicationSession().invalidate();  
        }    private void sendToAll(String from, String message)  
             throws ServletParseException, IOException {
            SipFactory factory = (SipFactory)getServletContext().
             getAttribute("javax.servlet.sip.SipFactory");        List list = (List)getServletContext().getAttribute(THE_LIST);
            Iterator users = list.iterator();
            while (users.hasNext()) { //Send this message to all on the list.
                String user = (String) users.next();            SipApplicationSession session = 
                    factory.createApplicationSession();
                SipServletRequest request = factory.createRequest(session, 
                        "MESSAGE", serverAddress, user);
                String msg = from + " sent message: \n" + message;
                request.setContent(msg.getBytes(), "text/plain");
                request.send();
            }
        }    private void sendToUser(String to, String message)  
                throws ServletParseException, IOException {
            SipFactory factory = (SipFactory)getServletContext().
             getAttribute("javax.servlet.sip.SipFactory");
            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 list = (List)getServletContext().getAttribute(THE_LIST);
            return list.contains(from);
        }    private void addUser(String from) {
            List list = (List)getServletContext().getAttribute(THE_LIST);
            list.add(from);
        }    private void removeUser(String from) {
            List list = (List)getServletContext().getAttribute(THE_LIST);
            list.remove(from);
        }
    }这是网上找的代码,没看到哪里开端口!你说的优化怎么优化呢?有没有demo可以参考!
    中文问题可否用二进制流来解决呢?(这个是顺便问的,我可以自己试一下)!还有,你有没有MSN或是别的,希望可以帮助我,先谢谢你的回答了!我的MSN:[email protected]
      

  11.   

    serverAddress = getServletConfig().getInitParameter(THE_NAME);
    这里从配置文件中读参数,这个参数包含端口至于优化,没有demo可以参考,你们可以在optimizeit上跑jain-sip,看哪里需要时间比较长就优化哪里JAIN-sip在把sip消息发到网络中之前是讲消息用utf-8编码了的。我认为如果parser不支持中文,你用二进制流也解决不料
      

  12.   

    另,JAIN-sip还有n多bug(多线程情况下)。
    能用bea的还是用bea的把我测过没有优化过的jain-sip,只支持12caps,4 cpu,8 g内存, solaris我们优化后达到了300caps
      

  13.   

    还有这种可能,如果应用创建了一个请求,请求uri中没有端口,那么server会自动将监听消息的端口设进request uri,可以截包看一下是否是这种情况不同的容器有不同的实现
      

  14.   

    可以留下你的联系方式吗?我的MSN:[email protected]邮箱:[email protected]
      

  15.   

    liaoxingya276(独孤过客) 你说的serverAddress = getServletConfig().getInitParameter(THE_NAME);
    我查询过,例子里在启动配置文件里对他设定了,但没有指定端口号,我指定了端口号,用一个客户端发请求,服务端收不到,serverAddress 的地址是sip:[email protected]:5555,一察看,端口根本没有打开,能帮我检查一下吗?谢谢了!
      

  16.   

    liaoxingya276(独孤过客) 快点出现!
      

  17.   

    你在什么公司?UT?
    HW?ZET?
      

  18.   

    建议拟将RFC3261和jsr116好好看看!
    这样能明白SIP容器的原理。
      

  19.   

    sip servlet 服务器  micromethod http://www.micromethod.com/ 不用配置,将sar文件copy 到SIPMethod\Standard\apps 下就行。 适合学习。
      

  20.   

    你在build.xml中搜下5060 一般默认是这个端口。
      

  21.   

    你在build.xml中搜下5060 一般默认是这个端口。这个不对。 服务器监听的端口是由容器来提供的。 如果是用的microMethod服务器,可以在http://localhost:8080 里修改监听端口。