我是套接字编程的新手:
是否可以在Java Socket上显式设置源端口?
我正在开发一个客户端/服务器应用程序,客户端可能会在多个端口上侦听来自服务器的回复。如果我可以在初始化Socket时在客户端设置此回复端口,那将是很好的,这样服务器就能够确定在另一端回复哪个端口。
答案 0 :(得分:6)
通常是这样的:
首先,服务器在一个众所周知的端口上打开一个ServerSocket并等待输入。
同时,客户端打开一个(客户端)Socket,其中包含服务器主机名和这个众所周知的端口地址。它向服务器发送请求消息以初始化通信会话。
服务器收到消息,生成一个工作线程,在另一个端口上打开另一个ServerSocket,服务器发送一个响应,告诉客户端这个端口号。
现在客户端关闭了实际的连接,并创建了一个新的Socket,现在有了他刚被告知的端口号。
这样,服务器一次可以处理多个客户端,因为每个客户端都获得了他自己的“连接”(端口)。
答案 1 :(得分:4)
答案 2 :(得分:3)
使用数据报套接字时,发送数据报时套接字设置源地址和端口。
InetAddress sourceAddr = InetAddress.getLocalHost();
DatagramSocket sock = new DatagramSocket(sourcePort, sourceAddr);
DatagramPacket msg = new DatagramPacket(mbuf, mbuf.length, dstIP, dstPort);
sock.send(msg); // sent from sourcePort to dstPort
在此示例中, sourceAddr
有点多余,new DatagramSocket(sourcePort)
将绑定到首选的最佳选择地址,但如果除了端口之外还需要指定源IP,那就是这样。
对于这两种类型的套接字,使用bind(new InetSocketAddress(port))
将选择适当的本地源地址和指定的端口,端口0也将选择适当的本地端口。
可以使用getLocalAddress()
和getLocalPort()
检索所有内容。
答案 3 :(得分:1)
您可以使用此调用来创建套接字
public Socket(InetAddress address,
int port,
InetAddress localAddr,
int localPort)
throws IOException
这通常是针对UDP进行的,不建议用于TCP连接。如果在两端为TCP执行此操作,则只能有一个TCP连接。如果再创建一个,套接字层将会混淆,最终会丢失所有连接。
对于TCP,通常的做法是使用相同的连接进行回复。如果您必须使用其他连接进行回复,请在客户端上使用预定义的端口。
答案 4 :(得分:0)
首先,我完全建议您使用Java NIO。
DatagramChannel udpchannel = DatagramChannel.open();
DatagramSocket udpsocket = udpchannel.socket();
SocketAddress sa = new InetSocketAddress(BIND_ADDRESS, BIND_PORT);
udpsocket.bind(sa);
其次,通过使用绑定到套接字地址,您还可以定义要连接到的网络地址。这意味着如果将BIND_ADDRESS设置为“0.0.0.0”,您将能够从连接到服务器的每个网卡进行监听;但是如果你将BIND_ADDRESS设置为“10.190.0.1”,你将只收到在这样的地址上收听的请求。