簡體   English   中英

Java:如何從一個端口上的客戶端套接字連接到不同的服務器?

[英]Java: how to connect to different servers from a client socket on one port?

TCP連接由四個元素(可能包括協議)標識:客戶端端口,客戶端地址,服務器端口,服務器地址。 因此,具有一個端口的客戶端可能會連接到多個不同的服務器,因為它們是不同的TCP連接。

這是我的演示:端口9999上的本地客戶端連接到端口12345和端口12346上的兩個本地服務器。但是代碼不正確。

有誰能夠幫助我? 請告訴我如何更正。(請勿使用SO_REUSEPORT或fork)

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketTest {

    public static void main(String[] args) throws IOException {


        startServer(12345);
        startServer(12346);

        Socket socket = new Socket();
        socket.bind(new InetSocketAddress(9999));
        System.out.println("client: " + socket.getLocalSocketAddress().toString());

        startClient(socket, 12345);
        startClient(socket, 12346);
    }

    public static void startClient(Socket socket, int port) {
        (new Thread() {
            @Override
            public void run() {
                try {
                    // Problem: connect() can be called only once
                    socket.connect(new InetSocketAddress(port));
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public static void startServer(int port) {
        new Thread() {
            @Override
            public void run() {
                ServerSocket ss;
                try {
                    ss = new ServerSocket(port);
                    System.out.println("listen on: " + ss.getLocalSocketAddress());
                    while (true) {
                        Socket s = ss.accept();
                        System.out.println("accept from: " + s.getRemoteSocketAddress());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

您可以將2個不同的套接字綁定到同一個本地端口(這就是SO_REUSEADDR的用途),但是一個單獨的套接字只能連接到一個單獨的目的地。

如果要發送一條消息,並且希望該消息被兩台服務器接收,則需要多播。 多播只能使用UDP(非TCP)和IANA未列出為保留的特殊多播地址之一(224.0.0.0至239.255.255.255)。

暫無
暫無

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

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