Files
open-xiaoai/packages/client-v2/src/net/network.rs
T

127 lines
3.4 KiB
Rust
Raw Normal View History

2026-01-02 09:59:29 +08:00
use crate::net::protocol::{AudioPacket, ControlPacket};
use anyhow::{Context, Result};
use std::net::SocketAddr;
use std::sync::Arc;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::{TcpListener, TcpStream, UdpSocket};
/// UDP 音频传输
pub struct AudioSocket {
socket: Arc<UdpSocket>,
}
impl AudioSocket {
pub async fn bind() -> Result<Self> {
let socket = UdpSocket::bind("0.0.0.0:0").await?;
Ok(Self {
socket: Arc::new(socket),
})
}
pub fn local_port(&self) -> Result<u16> {
Ok(self.socket.local_addr()?.port())
}
pub async fn send_packet(&self, packet: &AudioPacket, target: SocketAddr) -> Result<()> {
let bytes = postcard::to_allocvec(packet)?;
self.socket.send_to(&bytes, target).await?;
Ok(())
}
pub async fn recv_packet(&self, buf: &mut [u8]) -> Result<(AudioPacket, SocketAddr)> {
let (len, addr) = self.socket.recv_from(buf).await?;
let packet = postcard::from_bytes(&buf[..len])?;
Ok((packet, addr))
}
pub fn clone_inner(&self) -> Arc<UdpSocket> {
self.socket.clone()
}
}
/// TCP 控制连接
pub struct ControlConnection {
stream: TcpStream,
}
impl ControlConnection {
pub fn new(stream: TcpStream) -> Self {
Self { stream }
}
pub async fn send_packet(&mut self, packet: &ControlPacket) -> Result<()> {
let bytes = postcard::to_allocvec(packet)?;
2026-01-02 13:04:19 +08:00
let len = bytes.len() as u32;
self.stream.write_u32(len).await?;
2026-01-02 09:59:29 +08:00
self.stream.write_all(&bytes).await?;
Ok(())
}
2026-01-02 13:04:19 +08:00
pub async fn recv_packet(&mut self) -> Result<ControlPacket> {
let len = self.stream.read_u32().await? as usize;
if len > 10 * 1024 * 1024 {
return Err(anyhow::anyhow!("Packet too large: {}", len));
2026-01-02 09:59:29 +08:00
}
2026-01-02 13:04:19 +08:00
let mut buf = vec![0u8; len];
self.stream.read_exact(&mut buf).await?;
let packet = postcard::from_bytes(&buf)?;
2026-01-02 09:59:29 +08:00
Ok(packet)
}
pub fn split(
self,
) -> (
tokio::net::tcp::OwnedReadHalf,
tokio::net::tcp::OwnedWriteHalf,
) {
self.stream.into_split()
}
2026-01-02 13:04:19 +08:00
pub fn peer_addr(&self) -> Result<SocketAddr> {
self.stream.peer_addr().context("Failed to get peer addr")
}
2026-01-02 09:59:29 +08:00
}
2026-01-02 13:04:19 +08:00
/// 服务端网络管理器
pub struct ServerNetwork {
2026-01-02 09:59:29 +08:00
listener: TcpListener,
}
2026-01-02 13:04:19 +08:00
impl ServerNetwork {
2026-01-02 09:59:29 +08:00
pub async fn setup(port: u16) -> Result<Self> {
let listener = TcpListener::bind(format!("0.0.0.0:{}", port)).await?;
2026-01-02 13:04:19 +08:00
Ok(Self { listener })
2026-01-02 09:59:29 +08:00
}
pub async fn accept(&self) -> Result<(ControlConnection, SocketAddr)> {
let (stream, addr) = self.listener.accept().await?;
Ok((ControlConnection::new(stream), addr))
}
2026-01-02 13:04:19 +08:00
pub fn local_addr(&self) -> Result<SocketAddr> {
self.listener
.local_addr()
.context("Failed to get local addr")
2026-01-02 09:59:29 +08:00
}
}
2026-01-02 13:04:19 +08:00
/// 客户端网络管理器
pub struct ClientNetwork {
2026-01-02 09:59:29 +08:00
control: ControlConnection,
}
2026-01-02 13:04:19 +08:00
impl ClientNetwork {
pub async fn connect(server_addr: SocketAddr) -> Result<Self> {
let stream = TcpStream::connect(server_addr)
2026-01-02 09:59:29 +08:00
.await
2026-01-02 13:04:19 +08:00
.context(format!("无法连接到服务端 TCP 地址: {}", server_addr))?;
2026-01-02 09:59:29 +08:00
Ok(Self {
control: ControlConnection::new(stream),
})
}
2026-01-02 13:04:19 +08:00
pub fn into_control(self) -> ControlConnection {
self.control
2026-01-02 09:59:29 +08:00
}
}