关于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、如果做一个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发布成功,那客户端怎么请求服务端呢?原码里没有定义服务器名称和端口号,它是怎么侦听的呢?
但是帮你顶下!
UP
UP UP
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的方式间接触发的。
//那我写服务端的时候还用起线程吗?
2、能否给给推荐一个sip servlet的服务器!3、客户端可以是sip终端,直接发一个sip请求过来,如果sip容器受到了则会调用相应的servlet。当然这个sip请求也可能是通过http的方式间接触发的。
//sip请求的地址怎么写呢?因为服务端没有指明端口号!
//那我写服务端的时候还用起线程吗?////JAIN-SIP支持多线程就像tomcat支持多线程一样,应用不需要关心,如果应用侧有比较耗时的不需要同步的操作,还是要用线程的
2、能否给给推荐一个sip servlet的服务器!////bea的不行吗?
3、客户端可以是sip终端,直接发一个sip请求过来,如果sip容器受到了则会调用相应的servlet。当然这个sip请求也可能是通过http的方式间接触发的。
//sip请求的地址怎么写呢?因为服务端没有指明端口号!
////如果服务端不指明端口号,客户端怎么知道把消息发到哪里去??端口号是一定要指明的。
据我的推测,可能是JAIN-SIP的parser不支持中文
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]
这里从配置文件中读参数,这个参数包含端口至于优化,没有demo可以参考,你们可以在optimizeit上跑jain-sip,看哪里需要时间比较长就优化哪里JAIN-sip在把sip消息发到网络中之前是讲消息用utf-8编码了的。我认为如果parser不支持中文,你用二进制流也解决不料
能用bea的还是用bea的把我测过没有优化过的jain-sip,只支持12caps,4 cpu,8 g内存, solaris我们优化后达到了300caps
我查询过,例子里在启动配置文件里对他设定了,但没有指定端口号,我指定了端口号,用一个客户端发请求,服务端收不到,serverAddress 的地址是sip:[email protected]:5555,一察看,端口根本没有打开,能帮我检查一下吗?谢谢了!
HW?ZET?
这样能明白SIP容器的原理。