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

    @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抓包,看实际效果
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值