我应该为基于 tcp 的服务器客户端连接使用相同的端口吗

should I use the same port for tcp-based server-client-connection

我试图通过编写 java 程序(边做边学)来理解网络主题。我使用 java.net.Socket 在 java 中编写了一个客户端和一个服务器。客户端是 class,服务器是 class。然后我在一个 Main-class 中实例化了两个 classes。我电脑上的 java-Application 运行。当我为客户端和服务器分配相同的端口时,我没有收到任何错误(例如:端口 80)。但是当我分配不同的端口时(例如:端口 80 到服务器和端口 9090 到客户端)然后我得到一个错误。我应该为 tcp 连接使用相同的端口吗? 我想了解为什么会出现错误。 这是我的整个代码放在一个 java-package:

package client_server;
import java.io.IOException;
import java.io.PrintWriter;
import  java.net.*;
import java.util.Date;


public class Server {
    ServerSocket server;
    Server(){
       System.out.println("server starts");
        try{
        //server runs on port 9090
         server=new ServerSocket(9090);
        }catch(IOException e){
           e.printStackTrace();
        }
    }

void listen(){
    Socket socket = null;
    try {
        System.out.println("server is listining");
        socket=server.accept();
        PrintWriter out =new PrintWriter(socket.getOutputStream(), true);

        out.println(new Date().toString());
    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        try {
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }   
}       

}

package client_server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.*;
public class Client {
    Socket clientSocket;
    Client(){
        System.out.println("Client starts");
        final String server_ip_adress="127.0.0.1";
        try {
            clientSocket = new Socket(server_ip_adress,80);
        } catch (IOException e) {
            e.printStackTrace();
       }
   }

void connectToServer(){
    try{
        System.out.println("client connects to server");
        InputStream clientInput=clientSocket.getInputStream();
        BufferedReader input =  new BufferedReader(new InputStreamReader(clientInput));
        String answer = input.readLine();
        System.out.println(answer);

    }catch(IOException e){
        e.printStackTrace();
    }   
}

}

package client_server;
public class Main {
    public static void main(String [] args){
        Server server = new Server();
        Client client = new Client();
        server.listen();
        client. connectToServer();
   }
}

理论上它应该可以工作,因为每个进程(服务器进程和客户端进程)都会被分配一个端口,进程间通信是否发生在不同的端口上并不重要。

但就我而言,我只有一个过程。因此,当我分配不同的端口时,它会抛出错误。我的分析正确吗? 我收到此错误:地址已在使用中:JVM_Bind

服务器监听9090端口,所以客户端必须连接到9090端口。但是客户端并不是'assigned'9090端口。实际上当你运行netstat 连接客户端后,你会看到客户端正在使用另一个端口,由系统分配。

注意当你打印 'client connects to server' 客户端已经连接,当 new Socket(...) returns.