Java在socket通信时的一个问题
我们知道TCP通信时client会动态分配一个端口与发送给服务器的监听端口。现在我很想知道服务器监听到client之后分配的socket实例是不是还用监听的那个端口。现在...
我们知道TCP通信时client会动态分配一个端口与发送给服务器的监听端口。现在我很想知道服务器监听到client之后分配的socket实例是不是还用监听的那个端口。现在有大神说一,服务器还用这个端口,不过通过客户端的不同,将数据包分开处理。二,在CSDN也问了这个问题,不过回答是服务器程序不会用监听的端口,而是新分配一个端口号给socket实例与客户程序通信。
两种解释都觉得合理,但是只能是其中一个吧,求解释? 展开
两种解释都觉得合理,但是只能是其中一个吧,求解释? 展开
展开全部
import java.net.ServerSocket;
import java.net.Socket;
public class SocketDemo {
public static void main(String[] args) {
ThreadUtils.startThread(new MyThread() {
public void run() throws Exception {
ServerSocket server = new ServerSocket(10000);
for (int i = 0; i < 2; i++) {
Socket socket = server.accept();
System.out.printf("服务端(%s)远程端口: %s\n", (i + 1), socket.getPort());
System.out.printf("服务端(%s)本地端口: %s\n", (i + 1), socket.getLocalPort());
}
}
});
ThreadUtils.startThread(new MyThread() {
public void run() throws Exception {
for (int i = 0; i < 2; i++) {
Socket socket = new Socket("localhost", 10000);
ThreadUtils.sleep(100);
System.out.printf("客户端(%s)远程端口: %s\n", (i + 1), socket.getPort());
System.out.printf("客户端(%s)本地端口: %s\n", (i + 1), socket.getLocalPort());
}
}
});
}
public static class ThreadUtils {
public static void startThread(final MyThread myThread) {
new Thread() {
public void run() {
try {
myThread.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
public static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public interface MyThread {
public void run() throws Exception;
}
}
让代码说话吧,我做的测试,同时连接两个用户的情况下,服务器本地端口仍然是监听的端口。
看来一个端口同时只能有一个监听者,但是可以同时处理多个已连接的连接。
展开全部
我通过C#代码试了一下,确定是第一种,server端仍然用原来的端口。
仔细考虑这样也对。因为客户端每次都跟server listen的端口connect,如果server每次accept都再分配一个端口的话,而客户端依然用connect的那个端口去通信,显然就不对了
仔细考虑这样也对。因为客户端每次都跟server listen的端口connect,如果server每次accept都再分配一个端口的话,而客户端依然用connect的那个端口去通信,显然就不对了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
服务器端的端口肯定是固定的 不同的客户端用不同的线程处理 应该是这样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询