我正在使用Java来执行下面的套接字编程。
客户端程序如下:
Socket MyClient;
try {
MyClient = new Socket("Machine name", PortNumber);
}
catch (IOException e) {
System.out.println(e);
}
服务器程序如下:
ServerSocket MyService;
try {
MyServerice = new ServerSocket(PortNumber);
}
catch (IOException e) {
System.out.println(e);
}
Socket clientSocket = null;
try {
clientSocket = MyService.accept();
}
catch (IOException e) {
System.out.println(e);
}
现在我的问题是,如果我运行多个线程在一个端口中打开几个套接字(作为上面的服务器代码),我的客户端程序如何知道它连接到哪个套接字?
答案 0 :(得分:3)
您的客户端连接到Servers端口。所以所有客户都将拥有相同的代码
MyClient = new Socket("Machine name", <port where server is listening>);
在客户端开设的港口并不重要。客户端将在他的操作系统中获得一个免费端口。
答案 1 :(得分:2)
我的客户端程序如何知道它连接到哪个套接字?
这个问题没有意义。它根本不“连接到套接字”,它连接到监听端口,并且只有其中一个。您的服务器只接受一个客户端,因此第二个和后续的线程将获得一个未定义的行为,范围从ConnectException到ConnectionException,什么都不是,很可能是后者。
答案 2 :(得分:0)
您的应用程序知道它,因为您使用特定端口进行设置。 TCP / IP中没有内置“自动发现”,您可以选择服务器端口,并确保将客户端设置为连接到该端口。您可以将其硬编码到客户端应用程序中,或者更好的是,将其包含在客户端中包含的某个配置文件中。
这就是为什么你有一堆“已知端口”,如http是端口80.这意味着浏览器将始终连接到Web服务器上的端口80,除非您明确指出URL中的另一个端口。