Java编写SIP协议

news2024/11/15 10:49:22

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();
        }
    }

    @Override
    public 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();
            }
        }
    }

    @Override
    public void processResponse(ResponseEvent responseEvent) {}

    @Override
    public void processTimeout(TimeoutEvent timeoutEvent) {
        System.out.println("Transaction Timed Out");
    }

    @Override
    public void processIOException(IOExceptionEvent exceptionEvent) {
        System.out.println("IO Exception");
    }

    @Override
    public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
        System.out.println("Transaction Terminated");
    }

    @Override
    public 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();
        }
    }

    @Override
    public void processRequest(RequestEvent requestEvent) {}

    @Override
    public void processResponse(ResponseEvent responseEvent) {
        Response response = responseEvent.getResponse();
        System.out.println("Received Response: " + response.getStatusCode());
    }

    @Override
    public void processTimeout(TimeoutEvent timeoutEvent) {
        System.out.println("Transaction Timed Out");
    }

    @Override
    public void processIOException(IOExceptionEvent exceptionEvent) {
        System.out.println("IO Exception");
    }

    @Override
    public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
        System.out.println("Transaction Terminated");
    }

    @Override
    public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
        System.out.println("Dialog Terminated");
    }

    public static void main(String[] args) {
        SimpleSipClient client = new SimpleSipClient();
        client.sendInvite();
    }
}

3、使用wireshark抓包,看实际效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络的参数初始化【PyTorch】

文章目录 1、常见初始化方法2、代码2.1、导包&#xff1a;2.2、均匀分布随机初始化2.3、固定初始化2.4、全0初始化2.5、全1初始化2.6、正态分布随机初始化2.7、kaiming 初始化2.8、xavier 初始化2.9、完整代码 3、小节 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专…

哨兵Sentinel-2一些有趣的示例

每天我们都会观察周围的世界。在许多情况下&#xff0c;我们认为我们所看到的事物是不言而喻的&#xff0c;它们只是我们所认为的那样。其他时候&#xff0c;我们会更仔细地分析和询问那些看起来不太熟悉的事物。有时&#xff0c;仅仅改变我们的视觉视角就能提供额外的启发和启…

html实现我的博客文章相册源码

文章目录 1.设计来源1.1 相册界面1.2 相册详细界面1.3 文章界面1.4 文章详细界面1.5 关于我1.6 联系我 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;http…

轻松上手MYSQL:JSON函数实现高效数据查询与操作

&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL字符串函数之旅✨ &#x1f44b; 大家好&#xff01;文本学习和探…

「ETL趋势」定时任务自动化导出Excel/CSV,高效归档业务明细数据

目录 一、Excel/CSV文件输出应用场景 二、Excel/CSV文件输出的常见问题 三、合同订单数据文件输出实战 1&#xff09;合同订单数据输出为 CSV 文件 1、建立业务系统数据库、FTP/SFTP 服务器数据连接 2、数据处理 3、输出为文件 4、运行效果查看 2&#xff09;合同订单数据输出为…

数据结构第七讲:栈和队列OJ题

数据结构第七讲&#xff1a;栈和队列OJ题 1.有效的括号2.用队列实现栈3.用栈实现队列4.设计循环队列 1.有效的括号 链接: OJ题目链接 typedef char StackDataType;typedef struct Stack {StackDataType* arr;//使用一个指针来指向开辟的数组int capacity;//保存数组的空间大…

concrt140.dll丢失是什么情况?有效的解决dll!

concrt140.dll文件丢失是电脑中少见的文件&#xff0c;但也会因为某些原因会导致电脑丢失concrt140.dll文件&#xff0c;那么出现这文件的原因是什么呢&#xff1f;出现这样的问题有什么办法可以将concrt140.dll修复呢&#xff1f;一起来看看吧。 为什么会缺失concrt140.dll文件…

前端:数字世界的门面与灵魂

在当今数字化时代&#xff0c;前端作为用户与网站或应用直接交互的界面&#xff0c;其重要性不言而喻。它不仅是信息的展示窗口&#xff0c;更是用户体验&#xff08;UX&#xff09;和用户界面&#xff08;UI&#xff09;设计的核心。本文将深入剖析前端在整体网站或应用中的重…

vscode 创建QT最简工程

1. 前提条件 qt 安装cmake安装 参考&#xff1a; https://blog.csdn.net/qq_51355375/article/details/139890889vscode 环境配置 参考&#xff1a; https://blog.csdn.net/qq_51355375/article/details/140733495 2. 工程创建 include 放头文件src .cpp 文件CMakeList.tex …

物品租赁小程序论文(设计)开题报告

一、课题的背景和意义 近些年来&#xff0c;随着移动互联网巅峰时期的来临&#xff0c;互联网产业逐渐趋于“小、轻、微”的方向发展&#xff0c;符合轻应用时代特点的各类技术受到了不同领域的广泛关注。在诸多产品中&#xff0c;被誉为“运行着程序的网站”之名的微信小程序…

搭建开发环境

1、安装VMware 参考01【正点原子】ATK-DLRK3568嵌入式Linux系统开发手册V1.2 2、安装ubuntu 参考01【正点原子】ATK-DLRK3568嵌入式Linux系统开发手册V1.2 2.1、Ubuntu 系统设置 root 用户密码 新安装的ubuntu没有设置 root 用户密码,打开终端,输入 sudo passwd root 执…

C#使用NModbus4库创建Modbus TCP Slave(服务器)简单示例

本文续上篇Codesys—标准库ModbusTCP Master(客户端)配合C#的NModbus4库的通讯示例 链接&#xff1a;https://blog.csdn.net/wushangwei2019/article/details/136375234?spm1001.2014.3001.5501 上篇描述在Codesys端的Modbus TCP Master(客户端)的设备添加、IO映射、通讯简单…

机器视觉12-相机

相机 作用: 工业相机 是 机器视觉系统 的重要组成部分 最本质的功能就是通过CCD或CMOS成 像传感器将镜头产生的光信号转变为 有序的电信号&#xff0c;并将这些信息通过相 应接口传送到计算机主机 工业相机分类 目前业内没有对相机进行明确的分类定义&#xff0c; 以下分类是…

svn软件总成全内容

SVN软件总成 概述&#xff1a;本文为经验型文档 目录 D:\安装包\svn软件总成 的目录D:\安装包\svn软件总成\svn-base添加 的目录D:\安装包\svn软件总成\tools 的目录D:\安装包\svn软件总成\tools\sqlite-tools-win32-x86-3360000 的目录D:\安装包\svn软件总成\安装包-----bt lo…

一分钟搞定文件翻译|2024年4款翻译工具,职场达人都在用!

在全球化的大环境下&#xff0c;跨国沟通和协作变得非常普遍。不管是在公司间谈生意&#xff0c;还是跟外国朋友聊天&#xff0c;翻译文件成了我们经常要做的事情。但是一大堆文件和各种各样的语言&#xff0c;怎么才能又快又好地翻译出来&#xff0c;提升工作速度呢&#xff1…

本地部署Whisper Web结合内网穿透实现远程访问本地语音转文本模型

本地部署Whisper Web结合内网穿透实现远程访问本地语音转文本模型 &#x1f9d1; 博主简介&#xff1a;现任阿里巴巴嵌入式技术专家&#xff0c;15年工作经验&#xff0c;深耕嵌入式人工智能领域&#xff0c;精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者&…

分享10个免费的职场办公常用工具网站

在现代职场中&#xff0c;高效办公工具网站的使用可以显著提升工作效率。小编今天就和大家分享10个免费实用且高质量的职场办公常用工具网站。 1.Convertio Convertio是一个万能文件转换工具&#xff0c;支持多种格式之间的转换&#xff0c;包括PDF、Excel、Word等。它操作简…

C#与欧姆龙PLC 通信——fins udp协议

前言 欧姆龙PLC在工控领域占有很大的市场份额,在上位机编程领域,实现上位机和欧姆龙PLC的通信也是必备的技能,上位机和PLC可以通过fins udp和fins tcp协议通信,本文介绍的是fins udp协议,该协议具有传输速度快的特点,为了帮助大家学习fins udp协议,我编写了“欧姆龙Fin…

【从0制作自己的ros导航小车:上、下位机通信篇】上、下位机串口DMA通信

从0制作自己的ros导航小车 前言一、准备工作二、下位机端&#xff08;STM32&#xff09;三、上位机端&#xff08;旭日x3派&#xff09;四、测试 前言 下位机的电机驱动、轮速读取、偏航角读取都已经完成&#xff0c;接下来就是上下位机的桥梁&#xff1a;串口通信。 使用USB转…

Mysql in 与 exists

在MySQL中&#xff0c;IN和EXISTS都是用于子查询的条件语句&#xff0c;但它们在性能和使用场景上有不同的特点和应用。下面是对它们的详细介绍以及示例说明&#xff1a;