【问题标题】:should I use the same port for tcp-based server-client-connection我应该为基于 tcp 的服务器客户端连接使用相同的端口吗
【发布时间】:2015-10-15 00:22:59
【问题描述】:

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

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

【问题讨论】:

  • 您可能需要阅读套接字基础知识。您可能还想显示相关代码和实际的异常消息。基本上,服务器侦听端口,客户端连接到同一个端口。
  • 无论如何,您都不能在同一个 IP 上使用同一个端口,这让您的陈述难以相信。没有代码,我们无法回答。暂时关闭。
  • 我有基础知识(理论背景),但我从未编写过有关该主题的程序。所以我现在就这样做了::)

标签: sockets tcp process port


【解决方案1】:

服务器侦听端口 9090,因此客户端必须连接到端口 9090。但客户端并非“分配”端口 9090。实际上,当您在连接客户端后运行netstat 时,您将看到客户端正在使用另一个由系统分配的端口。

注意,当您打印“客户端连接到服务器”时,客户端已经连接,new Socket(...) 返回时。

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 2021-10-10
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多