我正在做一个简单的练习来理解套接字和服务器套接字。当myServerSocket = new ServerSocket(0)
端口被随机分配给套接字时。我想知道如何设置客户端以连接到该端口。如果随机分配,客户端如何找到侦听端口?
以下是来自服务器和客户端类的代码片段:
服务器:
public static void main(String[] args) {
try {
// First we create a server socket and bind it to a random port.
ServerSocket myServerSocket = new ServerSocket(0);
// wait for an incoming connection...
System.out.println("Server is waiting for an incoming connection on host="
+ InetAddress.getLocalHost().getCanonicalHostName()
+ " port=" + myServerSocket.getLocalPort());
Socket skt = myServerSocket.accept();
客户端:
public static void main(String[] args) {
// create a socket and bind it to the host/port server is listening on.
String host;
int port;
if(args.length==0) {
host = "localhost";
port = 9999;
} else {
host = args[0];
String portStr = args[1];
try {
port = Integer.parseInt(portStr);
} catch (NumberFormatException nfe) {
System.out.println("Whoops, invalid port number. Will default to 9999");
port = 9999;
}
}
答案 0 :(得分:2)
客户端有三个选项可以找到侦听端口:端口扫描,用户输入或共享目录。
端口扫描
客户端可以尝试连接到服务器上的所有有效端口;当它成功与您的服务器程序通信时,它可以停止尝试其他端口。
用户输入
启动服务器后,您将知道分配的端口。只需编写一个接口即可在客户端输入,客户端可以正常继续。
共享目录
在这种情况下,服务器可以向第三个服务器发出请求,告诉它最终使用了哪个端口。然后,客户端向第三个服务器发出请求以查找端口。这绝对是最复杂的选择,因为它依赖于混合中的另一台服务器。
答案 1 :(得分:1)
服务器的正常过程是使用所有客户端都知道的套接字端口。这就是为什么有众所周知的端口列表,以便众所周知的服务器,如Web服务器,ftp服务器,telnet服务器等都具有他们使用的标准端口。希望连接到这些服务器的客户端使用众所周知的端口作为连接请求的一部分。
但是在您的情况下,您可能会考虑做的是让服务器获取其端口,然后发布它正在使用的端口号。
或者你可以做的不是使用随机端口来选择服务器将使用的端口。
如果你决定选择一个端口,你应该使用一个众所周知的端口以外的端口,例如Wikipedia list of well known ports中提供的端口。
发布端口号意味着您需要某种方式让客户端发现您用于服务器的端口。存在许多不同的方法,但是它们都共享客户端以某种已知方式查询某些已知设备或服务器的能力。您可能有某种服务器提供服务器的查找目录,因此客户端会请求服务器使用该端口,例如Service Name and Transport Lookup Service。