Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# 持续集成工作流
# 在 push 和 pull request 时执行测试

name: CI

on:
push:
branches: [ main, master, develop, 'feature/**', 'release/**' ]
pull_request:
branches: [ main, master, develop ]

jobs:
build:
runs-on: ubuntu-latest

strategy:
matrix:
java-version: [17, 21]

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up JDK ${{ matrix.java-version }}
uses: actions/setup-java@v4
with:
java-version: ${{ matrix.java-version }}
distribution: 'temurin'

- name: Cache Maven packages
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2

- name: Build with Maven
run: mvn -B clean compile --file pom.xml

- name: Run tests
run: mvn -B test --file pom.xml

- name: Package
run: mvn -B package -DskipTests --file pom.xml

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sip-netty-spring-boot-jdk${{ matrix.java-version }}
path: target/*.jar
retention-days: 7
52 changes: 52 additions & 0 deletions .github/workflows/maven-publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# 发布 Maven 包到 GitHub Packages
# 当创建 Release 或手动触发时执行

name: Maven Publish

on:
release:
types: [created]
workflow_dispatch:
inputs:
version:
description: '发布版本号 (可选,默认使用 pom.xml 中的版本)'
required: false
type: string

jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
server-id: github
settings-path: ${{ github.workspace }}

- name: Cache Maven packages
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2

- name: Update version (if specified)
if: ${{ github.event.inputs.version != '' }}
run: mvn versions:set -DnewVersion=${{ github.event.inputs.version }} -DgenerateBackupPoms=false

- name: Build with Maven
run: mvn -B clean compile test package --file pom.xml

- name: Publish to GitHub Packages
run: mvn -B deploy --file pom.xml -DskipTests
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
227 changes: 227 additions & 0 deletions README.de.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
# SIP Netty Spring Boot

Eine hochleistungsfähige SIP-Protokollstack-Implementierung basierend auf Java 17+, Netty und Spring Boot.

[![Build Status](https://img.shields.io/badge/build-passing-brightgreen)]()
[![Java Version](https://img.shields.io/badge/Java-17%2B-blue)]()
[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.2%2B-green)]()
[![License](https://img.shields.io/badge/License-MIT-yellow)]()

**🌍 Sprachen**: [English](README.en.md) | [日本語](README.ja.md) | [Français](README.fr.md) | **Deutsch** | [한국어](README.ko.md) | [हिन्दी](README.hi.md) | [简体中文](README.md)

---

## Funktionen

- **Hohe Leistung**: Basierend auf Netty 4.x nicht-blockierendem I/O, erreicht **10.000+ Anfragen/Sekunde**
- **Geringe Latenz**: Durchschnittliche Verarbeitungslatenz **< 1ms**
- **Multi-Protokoll-Unterstützung**: UDP, TCP, WebSocket Transporte
- **Spring Boot Integration**: Auto-Konfiguration, Konfigurationseigenschaften, ereignisgesteuert
- **JDK 17+**: Nutzung moderner Java-Funktionen
- **Einfach zu Verwenden**: Annotations-gesteuerte Handler, Fluent Builder API
- **Vollständige SIP-Unterstützung**: INVITE, REGISTER, BYE, ACK, CANCEL, OPTIONS, MESSAGE und mehr

## Leistungskennzahlen

| Metrik | Wert | Anmerkungen |
|--------|------|-------------|
| Durchsatz | **~10.000+ req/s** | Multi-Client gleichzeitig |
| Einzelanfrage-Latenz | **< 1ms** | OPTIONS-Anfrage |
| P99-Latenz | **< 10ms** | Unter hoher Last |
| Gleichzeitige Verbindungen | **10.000+** | TCP/WebSocket |

> Siehe [Benchmark-Bericht](docs/BENCHMARK.md) für detaillierte Leistungsdaten.

## Dokumentation

| Dokument | Beschreibung |
|----------|--------------|
| [Integrationsanleitung](docs/INTEGRATION_GUIDE.md) | Nutzungsdokumentation, API-Referenz, Best Practices |
| [Entwicklungshandbuch](docs/DEVELOPMENT_GUIDE.md) | Architektur, Erweiterungsentwicklung, fortgeschrittene Themen |
| [Benchmark-Bericht](docs/BENCHMARK.md) | Leistungstestergebnisse, Optimierungsempfehlungen |
| [SIPp-Testanleitung](test/sipp/README.md) | Automatisierte Testszenarien und Verwendung |

## Schnellstart

### 1. Abhängigkeit Hinzufügen

```xml
<dependency>
<groupId>com.sip</groupId>
<artifactId>sip-netty-spring-boot</artifactId>
<version>1.0.0</version>
</dependency>
```

### 2. SIP-Server Aktivieren

```java
@SpringBootApplication
@EnableSipServer
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
```

### 3. Konfiguration (application.yml)

```yaml
sip:
server:
enabled: true
host: 0.0.0.0
udp-port: 5060
tcp-port: 5060
ws-port: 5066
transport:
udp-enabled: true
tcp-enabled: true
ws-enabled: false
```

### 4. SIP-Nachrichten Verarbeiten

#### Option 1: Spring Event Listener

```java
@Component
public class MySipHandler {

@Autowired
private SipServer sipServer;

@EventListener
public void handleRequest(SipRequestEvent event) {
SIPRequest request = event.getRequest();
InetSocketAddress remoteAddress = event.getRemoteAddress();
String transport = event.getTransport();

if ("INVITE".equals(request.getMethod())) {
SIPResponse response = SipResponseBuilder.from(request)
.ok()
.build();
sipServer.send(response, remoteAddress, transport);
}
}
}
```

#### Option 2: Annotations-gesteuerte Handler

```java
@SipHandler
public class MySipHandler {

@Autowired
private SipServer sipServer;

@SipMethod("INVITE")
public void handleInvite(SIPRequest request, InetSocketAddress remoteAddress, String transport) {
sipServer.send(SipResponseBuilder.from(request).trying().build(), remoteAddress, transport);
sipServer.send(SipResponseBuilder.from(request).ok().build(), remoteAddress, transport);
}

@SipMethod("REGISTER")
public void handleRegister(SIPRequest request, InetSocketAddress remoteAddress, String transport) {
sipServer.send(SipResponseBuilder.from(request).ok().build(), remoteAddress, transport);
}
}
```

## SIP-Client Verwenden

```java
@Autowired
private SipClient sipClient;

public void makeCall() {
sipClient.start().join();

// REGISTER senden
SIPResponse response = sipClient.sendRegister(
"sip:registrar.example.com",
"sip:user@example.com",
3600
).get();

// INVITE senden
sipClient.sendInvite("sip:callee@example.com", "sip:caller@example.com", sdpBody)
.thenAccept(resp -> {
if (resp.isSuccess()) {
System.out.println("Anruf verbunden!");
}
});
}
```

## Builder API

```java
// Anfrage erstellen
SIPRequest request = SipRequestBuilder.invite("sip:bob@biloxi.com")
.from("sip:alice@atlanta.com")
.to("sip:bob@biloxi.com")
.via("192.168.1.1", 5060)
.sdp(sdpBody)
.build();

// Antwort erstellen
SIPResponse response = SipResponseBuilder.from(request)
.ok()
.contact("<sip:server@example.com>")
.build();

// URI parsen
SipUri uri = SipUri.parse("sip:user@example.com:5060;transport=tcp");
```

## Konfigurationseigenschaften

| Eigenschaft | Beschreibung | Standard |
|-------------|--------------|----------|
| `sip.server.enabled` | SIP-Server aktivieren | `true` |
| `sip.server.host` | Bind-Adresse | `0.0.0.0` |
| `sip.server.udp-port` | UDP-Port | `5060` |
| `sip.server.tcp-port` | TCP-Port | `5060` |
| `sip.server.ws-port` | WebSocket-Port | `5066` |
| `sip.transport.udp-enabled` | UDP aktivieren | `true` |
| `sip.transport.tcp-enabled` | TCP aktivieren | `true` |
| `sip.transport.ws-enabled` | WebSocket aktivieren | `false` |

## Build und Test

```bash
# Kompilieren
mvn compile

# Testen
mvn test

# Paketieren
mvn package

# Server starten
mvn spring-boot:run
```

## Anforderungen

- JDK 17 oder höher
- Maven 3.6+
- Spring Boot 3.2+

## Projektstatus

- ✅ Kern-Protokollstack-Implementierung
- ✅ Spring Boot Auto-Konfiguration
- ✅ UDP/TCP/WebSocket Transporte
- ✅ Ereignisgesteuerte Nachrichtenverarbeitung
- ✅ Integrations- und Leistungstests
- 🚧 TLS-Unterstützung (in Arbeit)
- 🚧 SIP-Authentifizierung (in Arbeit)

## Lizenz

MIT License
Loading