




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网站上关于基于sip的java编程实例实在是太少了,这个严重影响了sip的传播和发展,所以我上传了这个小实验,让大家参考下。在做实验前,我们需要一些东西:我的环境:XPEclipse需要包:这个需要在网上自己找,或者hi我,我也可以给你们哈。-百度账号:时光可见好了,现在看程序了哈,主要是三个文件。MessageProcessor.java :public interface MessageProcessor public void processMessage(String sender, String message); public void processError(String errorMessage); public void processInfo(String infoMessage);SipLayer.java :import java.text.ParseException;import java.util.*;import javax.sip.*;import javax.sip.address.*;import javax.sip.header.*;import javax.sip.message.*;public class SipLayer implements SipListener private MessageProcessor messageProcessor;private String username;private SipStack sipStack;private SipFactory sipFactory;private AddressFactory addressFactory;private HeaderFactory headerFactory;private MessageFactory messageFactory;private SipProvider sipProvider;/* Here we initialize the SIP stack. */public SipLayer(String username, String ip, int port)throws PeerUnavailableException, TransportNotSupportedException,InvalidArgumentException, ObjectInUseException,TooManyListenersException setUsername(username);sipFactory = SipFactory.getInstance();sipFactory.setPathName(gov.nist);Properties properties = new Properties();properties.setProperty(javax.sip.STACK_NAME, TextClient);properties.setProperty(javax.sip.IP_ADDRESS, ip);/ DEBUGGING: Information will go to files/ textclient.log and textclientdebug.logproperties.setProperty(gov.nist.javax.sip.TRACE_LEVEL, 32);properties.setProperty(gov.nist.javax.sip.SERVER_LOG, textclient.txt);properties.setProperty(gov.nist.javax.sip.DEBUG_LOG, textclientdebug.log);sipStack = sipFactory.createSipStack(properties);headerFactory = sipFactory.createHeaderFactory();addressFactory = sipFactory.createAddressFactory();messageFactory = sipFactory.createMessageFactory();/ListeningPoint tcp = sipStack.createListeningPoint(port, tcp);ListeningPoint udp = sipStack.createListeningPoint(port, udp);/ sipProvider = sipStack.createSipProvider(tcp);/ sipProvider.addSipListener(this);/ suppose UDP is used as transport, Bob Cheng, 03-11-10sipProvider = sipStack.createSipProvider(udp);sipProvider.addSipListener(this);/* * This method uses the SIP stack to send a message. */public void sendMessage(String to, String message) throws ParseException,InvalidArgumentException, SipException SipURI from = addressFactory.createSipURI(getUsername(), getHost() + : + getPort();Address fromNameAddress = addressFactory.createAddress(from);fromNameAddress.setDisplayName(getUsername();FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress, textclientv1.0);String username = to.substring(to.indexOf(:) + 1, to.indexOf();String address = to.substring(to.indexOf() + 1);SipURI toAddress = addressFactory.createSipURI(username, address);Address toNameAddress = addressFactory.createAddress(toAddress);toNameAddress.setDisplayName(username);ToHeader toHeader = headerFactory.createToHeader(toNameAddress, null);SipURI requestURI = addressFactory.createSipURI(username, address);requestURI.setTransportParam(udp);ArrayList viaHeaders = new ArrayList();ViaHeader viaHeader = headerFactory.createViaHeader(getHost(), getPort(), udp, branch1);viaHeaders.add(viaHeader);CallIdHeader callIdHeader = sipProvider.getNewCallId();CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1, Request.MESSAGE);MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70);Request request = messageFactory.createRequest(requestURI,Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,toHeader, viaHeaders, maxForwards);SipURI contactURI = addressFactory.createSipURI(getUsername(), getHost();contactURI.setPort(getPort();Address contactAddress = addressFactory.createAddress(contactURI);contactAddress.setDisplayName(getUsername();ContactHeader contactHeader = headerFactory.createContactHeader(contactAddress);request.addHeader(contactHeader);ContentTypeHeader contentTypeHeader = headerFactory.createContentTypeHeader(text, plain);request.setContent(message, contentTypeHeader);sipProvider.sendRequest(request);/* This method is called by the SIP stack when a response arrives. */public void processResponse(ResponseEvent evt) Response response = evt.getResponse();int status = response.getStatusCode();if (status = 200) & (status 300) / Success!messagePcessInfo(-Sent);return;messagePcessError(Previous message not sent: + status);/* * This method is called by the SIP stack when a new request arrives. */public void processRequest(RequestEvent evt) Request req = evt.getRequest();String method = req.getMethod();if (!method.equals(MESSAGE) / bad request type.messagePcessError(Bad request type: + method);return;FromHeader from = (FromHeader) req.getHeader(From);messagePcessMessage(from.getAddress().toString(),new String(req.getRawContent();Response response = null;try / Reply with OKresponse = messageFactory.createResponse(200, req);ToHeader toHeader = (ToHeader) response.getHeader(ToHeader.NAME);toHeader.setTag(888); / This is mandatory as per the spec.ServerTransaction st = sipProvider.getNewServerTransaction(req);st.sendResponse(response); catch (Throwable e) e.printStackTrace();messagePcessError(Cant send OK reply.);/* * This method is called by the SIP stack when theres no answer to a * message. Note that this is treated differently from an error message. */public void processTimeout(TimeoutEvent evt) messagePcessError(Previous message not sent: + timeout);/* * This method is called by the SIP stack when theres an asynchronous * message transmission error. */public void processIOException(IOExceptionEvent evt) messagePcessError(Previous message not sent: + I/O Exception);/* * This method is called by the SIP stack when a dialog (session) ends. */public void processDialogTerminated(DialogTerminatedEvent evt) /* * This method is called by the SIP stack when a transaction ends. */public void processTransactionTerminated(TransactionTerminatedEvent evt) public String getHost() int port = sipProvider.getListeningPoint().getPort();String host = sipStack.getIPAddress();return host;public int getPort() int port = sipProvider.getListeningPoint().getPort();return port;public String getUsername() return username;public void setUsername(String newUsername) username = newUsername;public MessageProcessor getMessageProcessor() return messageProcessor;public void setMessageProcessor(MessageProcessor newMessageProcessor) messageProcessor = newMessageProcessor;TextClient.java :import java.awt.event.*;import javax.swing.*;import .InetAddress;public class TextClient extends JFrame implements MessageProcessor private SipLayer sipLayer;private JTextField fromAddress;private JLabel fromLbl;private JLabel receivedLbl;private JTextArea receivedMessages;private JScrollPane receivedScrollPane;private JButton sendBtn;private JLabel sendLbl;private JTextField sendMessages;private JTextField toAddress;private JLabel toLbl;public static void main(String args) if (args.length != 2) printUsage();System.exit(-1);try String username = args0;int port = Integer.parseInt(args1);String ip = InetAddress.getLocalHost().getHostAddress();System.out.println(-username = +username+n-port = +port+n-ip = +ip);SipLayer sipLayer = new SipLayer(username, ip, port);TextClient tc = new TextClient(sipLayer);sipLayer.setMessageProcessor(tc);/ tc.show();tc.setVisible(true); catch (Throwable e) System.out.println(Problem initializing the SIP stack.);e.printStackTrace();System.exit(-1);private static void printUsage() System.out.println(Syntax:);System.out.println( java -jar textclient.jar );System.out.println(where is the nickname of this user);System.out.println(and is the port number to use. Usually 5060 if not used by another process.);System.out.println(Example:);System.out.println( java -jar textclient.jar snoopy71 5061);public TextClient(SipLayer sip) super();sipLayer = sip;initWindow();String from = sip: + sip.getUsername() + + sip.getHost() + : + sip.getPort();this.fromAddress.setText(from);private void initWindow() receivedLbl = new JLabel();sendLbl = new JLabel();sendMessages = new JTextField();receivedScrollPane = new JScrollPane();receivedMessages = new JTextArea();fromLbl = new JLabel();fromAddress = new JTextField();toLbl = new JLabel();toAddress = new JTextField();sendBtn = new JButton();getContentPane().setLayout(null);setTitle(TextClient);addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent evt) System.exit(0););receivedLbl.setText(Received Messages:);receivedLbl.setAlignmentY(0.0F);receivedLbl.setPreferredSize(new java.awt.Dimension(25, 100);getContentPane().add(receivedLbl);receivedLbl.setBounds(5, 0, 136, 20);sendLbl.setText(Send Message:);getContentPane().add(sendLbl);sendLbl.setBounds(5, 150, 90, 20);getContentPane().add(sendMessages);sendMessages.setBounds(5, 170, 270, 20);receivedMessages.setAlignmentX(0.0F);receivedMessages.setEditable(false);/设置为不可编辑receivedMessages.setLineWrap(true);/设置可换行receivedMessages.setWrapStyleWord(true);/设置换行方式为单词边界换行receivedScrollPane.setViewportView(receivedMessages);receivedScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);getContentPane().add(receivedScrollPane);receivedScrollPane.setBounds(5, 20, 270, 130);fromLbl.setText(From:);getContentPane().add(fromLbl);fromLbl.setBounds(5, 200, 35, 15);getContentPane().add(fromAddress);fromAddress.setBounds(40, 200, 235, 20);fromAddress.setEditable(false);toLbl.setText(To:);getContentPane().add(toLbl);toLbl.setBounds(5, 225, 35, 15);getContentPane().add(toAddress);toAddress.setBounds(40, 225, 235, 21);sendBtn.setText(Send);sendBtn.addActionListener(new ActionListener() public void actionPerformed(ActionEvent evt) sendBtnActionPerformed(evt););getContentPane().add(sendBtn);sendBtn.setBounds(200, 255, 75, 25);java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();setBounds(screenSize.width - 288) / 2, (screenSize.height - 310) / 2,288, 320);private void sendBtnActionPerformed(ActionEvent evt) try String to = this.toAddress.getText();String message = this.sendMessages.getText();sipLayer.sendMessage(to, message); catch (Throwable e) e.printStackTrace();this.receivedMessages.append(ERROR sending message: + e.getMessage() + n);public void processMessage(String sender, String message) this.receivedMessages.append(From + sender + : + message + n);public void processError(String errorMessage) this.receivedMessages.append(ERROR: + errorMessage + n);public void processInfo(String infoMessage) this.receivedMessages.append(infoMessage + n);上面是一个简单的发送接收程序哈。运行截图:注意这里的ip和port是由电脑上获取的,要是你的程序不能运行,那可能是你的电脑没有连接、或者是连接断开。可以自行在程序中设置ip和port。对这个程序的说明:注意:这是一个本机发送本机接收的例子。对于整个程序的分析:* 在运行程序的时候,将自动获取发送方的username-bob、port-8000、ip-* 定义一个SipLayer变量sipLayer,传入参数(username、portip),再将其传递给TextClient类的构造函数-这样在TextClient
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络环境下的安全问题分析试题及答案
- 机电工程考试高效答题技巧与试题及答案
- 西方国家的文化政策与全球治理试题及答案
- 公共政策中的社区参与的重要性试题及答案
- 网络工程师复习重点试题及答案合集
- 及时反馈的软件设计师考试试题及答案
- 2025年初级银行从业资格(银行管理)考试练习题库
- 机电工程监测技术试题及答案
- 跨文化团队的挑战与机遇及试题答案
- 引导机电工程考试思考的实践操作试题及答案
- 陕西府谷电厂二期(2×660MW)工程环评报告
- 七年级语文下期末复习计划
- 护理相关法律法规 课件
- 社区工作者经典备考题库(必背300题)
- 中职《PLC技术与应用》期末考试试卷
- 安全生产标准化管理体系
- QCT302023年机动车用电喇叭技术条件
- 中医内科学方剂+歌诀
- 分形理论幻灯片
- 汽车租赁后续服务承诺
- 高风险作业检查表
评论
0/150
提交评论