【发布时间】:2021-03-08 23:34:06
【问题描述】:
我有一个侦听 TCP 端口 5000 的 VoIP 服务器。此端口对于所有接收和建立的连接都是必需的。 由于服务器引导程序使用端口 5000,如何创建源端口 = 5000 的客户端 TCP 连接?
示例场景: 客户 A 呼叫客户 B。需要进行两个单独的呼叫:
- A(端口 5111)-> 服务器(端口 5000)
- 服务器(端口 5000)-> B(端口 9999)
在调用 1 时,目标端口 = 5000 (ServerBootstrap)。 On call 2 源端口需要为 5000(客户端引导)。
谁能给我一盏灯?
服务器
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap tcpBootstrap = new ServerBootstrap();
tcpBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>()
{
@Override
public void initChannel(final SocketChannel ch) throws Exception
{
final ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("decoder", new SipMessageStreamDecoder());
pipeline.addLast("encoder", new SipMessageEncoder());
pipeline.addLast("handler", new DialerHandlerTCP());
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.option(ChannelOption.SO_REUSEADDR, true)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childOption(ChannelOption.TCP_NODELAY, true);
tcpBootstrap.bind(socketAddress).sync().channel();
客户端代码
Bootstrap bootstrapClient = new Bootstrap();
bootstrapClient.group(networkBind.channel.eventLoop()).channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>()
{
@Override
public void initChannel(final SocketChannel ch) throws Exception
{
final ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("decoder", new SipMessageStreamDecoder());
pipeline.addLast("encoder", new SipMessageEncoder());
pipeline.addLast("handler", new DialerHandlerTCP());
}
});
【问题讨论】: