簡體   English   中英

如何使用Netty為服務器配置源端口以發送UDP數據包?

[英]How can I configure the source port for a server using Netty to send UDP packets?

我有一個服務器任務,使用Netty進行套接字I / O. 它綁定到端口MY_PORT並從客戶端接收UDP消息。 它響應這些客戶端,使用目標端口MY_PORT將消息發送回客戶端。 使用wireshark,我看到來自我服務器的傳出數據包也有一個MY_PORT的源端口。 一切正常。

服務器和客戶端之間的網絡負責人在負載均衡器方面存在一些問題。 他們表示如果我的服務器發送給客戶端的UDP消息具有與用於目的地的源端口不同的源端口 ,它將幫助他們。

我查看了Netty API,但我不確定如何做到這一點。 似乎因為我已經綁定到本地端口,我必須使用它來傳輸數據包? 這是我的代碼的精簡版。

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.socket.nio.NioDatagramChannelFactory;

public class UdpServer {

    private final int port;
    private Channel serverChannel;

    public UdpServer( int port ) {
        super();
        this.port = port;
    }

    public void start() {
        NioDatagramChannelFactory serverChannelFactory =
            new NioDatagramChannelFactory( Executors.newCachedThreadPool(), 1 );
        ConnectionlessBootstrap serverBootstrap =
            new ConnectionlessBootstrap( serverChannelFactory );
        serverBootstrap.setPipelineFactory( new ChannelPipelineFactory() {
            @Override
            public ChannelPipeline getPipeline() {
                return Channels.pipeline( new SimpleChannelHandler() {
                    @Override
                    public void messageReceived( ChannelHandlerContext ctx,
                        MessageEvent e ) {
                        // TODO, handle message from client
                    }
                } );
            }
        } );
        serverBootstrap.setOption( "reuseAddress", Boolean.TRUE );
        final InetSocketAddress trafficAddress = new InetSocketAddress( port );
        serverChannel = serverBootstrap.bind( trafficAddress );
    }

    public void sendMessage( byte[] message, String clientIp )
        throws UnknownHostException {
        // TODO, how do I control the source port of this packet??
        SocketAddress address =
            new InetSocketAddress( InetAddress.getByName( clientIp ), port );
        ChannelBuffer buffer = ChannelBuffers.wrappedBuffer( message );
        serverChannel.write( buffer, address );
    }

}

您已經在使用bind()來設置本地地址。 您可以使用connect()連接到特定的目標端口(“連接”概念的一部分)。 在常規數據報套接字上,您可以在發送請求中包含遠程端口,但如果您使用write() 在這種情況下,您必須使用connect()

他們表示如果我的服務器發送給客戶端的UDP消息具有與用於目的地的源端口不同的源端口,它將幫助他們。

這對我來說聽起來很完整。 網絡管理員似乎不知道如何實際分配源/目標端口。 即使客戶端使用系統分配的詩而不是固定端口(系統可能應該使用),系統仍然可以分配與服務器使用的端口號相同的端口號。

但是,您可以通過讓客戶端使用系統分配的端口而不是固定端口來關閉它們,或者至少將它們移到另一個問題上。 除非當然有客戶端防火牆......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM