[英]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.