Java编写SIP协议
1、编写Server代码
package com.genersoft.iot.vmp.sip;
import javax.sip.*;
import javax.sip.message.*;
import javax.sip.header.*;
import java.util.*;public class SimpleSipServer implements SipListener {private SipFactory sipFactory;private SipStack sipStack;private SipProvider sipProvider;private MessageFactory messageFactory;private String ip = "127.0.0.1";public SimpleSipServer() {try {sipFactory = SipFactory.getInstance();sipFactory.setPathName("gov.nist");Properties properties = new Properties();properties.setProperty("javax.sip.STACK_NAME", "SimpleSipServer");properties.setProperty("javax.sip.IP_ADDRESS", ip);properties.setProperty("javax.sip.RETRANSMISSION_FILTER", "on");sipStack = sipFactory.createSipStack(properties);ListeningPoint listeningPoint = sipStack.createListeningPoint(ip, 5060, "udp");sipProvider = sipStack.createSipProvider(listeningPoint);sipProvider.addSipListener(this);messageFactory = sipFactory.createMessageFactory();} catch (Exception e) {e.printStackTrace();}}@Overridepublic void processRequest(RequestEvent requestEvent) {Request request = requestEvent.getRequest();System.out.println("Received Request: " + request.getMethod());if (request.getMethod().equals(Request.INVITE)) {try {Response response = messageFactory.createResponse(Response.OK, request);sipProvider.sendResponse(response);System.out.println("Sent 200 OK response to INVITE");} catch (Exception e) {e.printStackTrace();}}}@Overridepublic void processResponse(ResponseEvent responseEvent) {}@Overridepublic void processTimeout(TimeoutEvent timeoutEvent) {System.out.println("Transaction Timed Out");}@Overridepublic void processIOException(IOExceptionEvent exceptionEvent) {System.out.println("IO Exception");}@Overridepublic void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {System.out.println("Transaction Terminated");}@Overridepublic void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {System.out.println("Dialog Terminated");}public static void main(String[] args) {new SimpleSipServer();}
}
2、编写Client端代码
package com.genersoft.iot.vmp.sip;
import javax.sip.*;
import javax.sip.address.*;
import javax.sip.message.*;
import javax.sip.header.*;
import java.util.*;
public class SimpleSipClient implements SipListener {private SipFactory sipFactory;private SipStack sipStack;private SipProvider sipProvider;private AddressFactory addressFactory;private MessageFactory messageFactory;private HeaderFactory headerFactory;private String ip = "127.0.0.1";public SimpleSipClient() {try {sipFactory = SipFactory.getInstance();sipFactory.setPathName("gov.nist");Properties properties = new Properties();properties.setProperty("javax.sip.STACK_NAME", "SimpleSipClient");properties.setProperty("javax.sip.OUTBOUND_PROXY", ip+":5060/udp");properties.setProperty("javax.sip.IP_ADDRESS", ip);sipStack = sipFactory.createSipStack(properties);ListeningPoint listeningPoint = sipStack.createListeningPoint(ip, 5070, "udp");sipProvider = sipStack.createSipProvider(listeningPoint);sipProvider.addSipListener(this);addressFactory = sipFactory.createAddressFactory();messageFactory = sipFactory.createMessageFactory();headerFactory = sipFactory.createHeaderFactory();} catch (Exception e) {e.printStackTrace();}}public void sendInvite() {try {SipURI fromUri = addressFactory.createSipURI("client", ip);Address fromAddress = addressFactory.createAddress(fromUri);fromAddress.setDisplayName("Client");SipURI toUri = addressFactory.createSipURI("server", ip);Address toAddress = addressFactory.createAddress(toUri);toAddress.setDisplayName("Server");SipURI requestUri = addressFactory.createSipURI("server", ip+":5060");FromHeader fromHeader = headerFactory.createFromHeader(fromAddress, "client123");ToHeader toHeader = headerFactory.createToHeader(toAddress, null);CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1L, Request.INVITE);CallIdHeader callIdHeader = sipProvider.getNewCallId();MaxForwardsHeader maxForwardsHeader = headerFactory.createMaxForwardsHeader(70);ViaHeader viaHeader = headerFactory.createViaHeader(ip, 5070, "udp", null);ContactHeader contactHeader = headerFactory.createContactHeader(fromAddress);ArrayList<ViaHeader> viaHeaders = new ArrayList<>();viaHeaders.add(viaHeader);Request request = messageFactory.createRequest(requestUri, Request.INVITE, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwardsHeader);request.addHeader(contactHeader);ClientTransaction transaction = sipProvider.getNewClientTransaction(request);transaction.sendRequest();System.out.println("Sent INVITE request");} catch (Exception e) {e.printStackTrace();}}@Overridepublic void processRequest(RequestEvent requestEvent) {}@Overridepublic void processResponse(ResponseEvent responseEvent) {Response response = responseEvent.getResponse();System.out.println("Received Response: " + response.getStatusCode());}@Overridepublic void processTimeout(TimeoutEvent timeoutEvent) {System.out.println("Transaction Timed Out");}@Overridepublic void processIOException(IOExceptionEvent exceptionEvent) {System.out.println("IO Exception");}@Overridepublic void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {System.out.println("Transaction Terminated");}@Overridepublic void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {System.out.println("Dialog Terminated");}public static void main(String[] args) {SimpleSipClient client = new SimpleSipClient();client.sendInvite();}
}
3、使用wireshark抓包,看实际效果

相关文章:
Java编写SIP协议
1、编写Server代码 package com.genersoft.iot.vmp.sip; import javax.sip.*; import javax.sip.message.*; import javax.sip.header.*; import java.util.*;public class SimpleSipServer implements SipListener {private SipFactory sipFactory;private SipStack sipStack…...
大型语言模型LLM的核心概念
本文主要介绍了目前主流的,几个大型语言模型LLM的整个训练过程 通常分为下面的几个阶段 1. 预训练 采用互联网上的大量数据进行训练,这一阶段大模型LLM的主体已定,找出共性并且压缩成一个模型。模型的参数量不是越大越好,遵循合理…...
软件测试---网络基础、HTTP
一、网络基础 (1)Web和网络知识 网络基础TCP/IP 使用HTTP协议访问Web WWW万维网的诞生 WWW万维网的构成 (2)IP协议 (3)可靠传输的TCP和三次握手策略 (4)域名解析服务DNS ࿰…...
韩顺平0基础学java——第39天
p820-841 jdbc和连接池 1.JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。 2.Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。 3.jdbc原理图 JDBC带来的好处 2.JDBC带来的…...
Linux文件恢复
很麻烦 一般还是小心最好 特别恢复的时候 可能不能选择某个文件夹去扫描恢复 所以 删除的时候 用rm -i代替rm 一定小心 以及 探索下linux的垃圾箱机制 注意 一定要恢复到不同文件夹 省的出问题 法1 系统自带工具 debugfs 但是好像不能重启? testdisk 1、安装 …...
大数据的数据质量有效提升的研究
大数据的数据质量有效提升是一个涉及多个环节和维度的复杂过程。以下是从数据采集、处理、管理到应用等方面,对大数据数据质量有效提升的研究概述: 一、数据采集阶段 明确采集需求:在数据采集前,需明确数据需求,包括…...
Flink-CDC解析(第47天)
前言 本文主要概述了Flink-CDC. 1. CDC 概述 1.1 什么是CDC? CDC是(Change Data Capture 变更数据获取)的简称 ,在广义的概念上,只要是能捕获数据变更的技术,都可以称之为 CDC。 核心思想是,…...
二阶段测试
二阶段测试 1、部署框架前准备工作 服务器类型部署组件ip地址DR1调度服务器 主(ha01)KeepalivedLVS-DR192.168.168.21DR2调度服务器 备 (ha02)KeepalivedLVS-DR192.168.168.22web1节点服务器 (slave01)NginxTomcatMySQL 备MHA managerMHA node192.168.1…...
CSP-J模拟赛day1——解析+答案
题目传送门 yjq的吉祥数 题解 送分题,暴力枚举即可 Code #include<bits/stdc.h> using namespace std;int l,r; int num1,tmp0,q[10000],a[10000]; int k (int x){for (int j1;j<tmp;j){if (xq[j])return 0;}return 1; } int main(){while (num<100…...
【PostgreSQL案例】我要查的表没有在执行计划中
问题:查的表没有在执行计划中 sql: SELECT* FROM(SELECTA.column1 as "column1",--中间省略很多A字段A.column99 as "column99"fromtable_a Aleft join (SELECTlzl_idfromtable_a AAinner join table_b BB ON AA.lzl_key BB.lzl_…...
《程序猿入职必会(5) · CURD 页面细节规范 》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
操作系统面试知识点总结5
#来自ウルトラマンメビウス(梦比优斯) 1 IO管理概述 1.1 I/O 设备 I/O 设备的类型分类。 1.1.1 按使用特性 人机交互类外部设备,例如打印机、显示器等。存储设备,例如磁盘、光盘等。网络通信设备,例如网络接口等。 1…...
BigInteger和BigDecimal类
一、应用场景 1. BigInteger 类 目前,我们学过最大的是long类型,但是,在实际开发时候,很有可能遇见超出long类型范围的数,我们就需要用BigInteger类; ① add 加 ② subtract 减 ③ multiply 乘…...
2024最新Uniapp的H5网页版添加谷歌授权验证
现在教程不少,但是自从谷歌升级验证之后,以前的老教程就失效了,现在写一个新教程以备不时之需。 由于众所周知的特殊原因,开发的时候一定注意网络环境,如果没有梯子是无法进行开发的哦~ clientID的申请方式我就不再进…...
学习java第一百四十四天
Spring通知有哪些类型? 在AOP术语中,切面的工作被称为通知。通知实际上是程序运行时要通过Spring AOP框架来触发的代码段。 Spring切面可以应用5种类型的通知: 前置通知(Before):在目标方法被调用之前调用通…...
Meta 发布 Llama3.1,一站教你如何推理、微调、部署大模型
最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解…...
XSSFWorkbook 和 SXSSFWorkbook 的区别
在现代办公环境中,处理 Excel 文件是一个常见的任务。Apache POI 是一个流行的 Java 库,能够读写 Microsoft Office 文档。对于处理 Excel 文件,Apache POI 提供了 XSSFWorkbook 和 SXSSFWorkbook 两个类。本文将详细介绍这两个类的特点和适用…...
会议主题:NICE Seminar|神经组合优化方法的大规模泛化研究(南方科技大学王振坤副研究员)
数据增强 获得更多解 TSP问题 最优解与序列无关,数据增强 ICML 2024 Position Rethinking Post-Hoc Search-Based Neural Approaches for Solving Large-Scale Traveling Salesman Problems...
昇思25天学习打卡营第22天|CycleGAN图像风格迁移互换
相关知识 CycleGAN 循环生成网络,实现了在没有配对示例的情况下将图像从源域X转换到目标域Y的方法,应用于域迁移,也就是图像风格迁移。上章介绍了可以完成图像翻译任务的Pix2Pix,但是Pix2Pix的数据必须是成对的。CycleGAN中只需…...
《Java初阶数据结构》----6.<优先级队列之PriorityQueue底层:堆>
前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
