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抓包,看实际效果