【问题标题】:Why ServerSocket Object's accept method returns a Socket object with a different port为什么ServerSocket对象的accept方法返回一个不同端口的Socket对象
【发布时间】:2014-01-15 15:28:25
【问题描述】:

我已经在 stackoverflow 中搜索了我的问题的答案,但我无法从这些线程中得​​到答案。我的问题是为什么一个ServeerSocket对象的accept()方法返回一个监听服务器机器上不同端口的Socket对象,而服务器正在监听的端口是另一个。

JAVA代码:

package chat.server;

import java.io.*;
import java.net.*;

public class ServerApp {
    public String[] advices = {"Take smaller bites",
            "Go for the tight jeans. No they do NOT make you look fat.",
            "One word: inappropriate",
            "Just for today, be honest. Tell your boss what you *really* think",
            "You might want to rethink that haircut."};
    public ServerSocket serverSocket;

    public ServerApp()
    {
        try
        {
            serverSocket = new ServerSocket(4245);
            System.out.println("Server Started.");
        }catch (Exception exception)
        {
            exception.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ServerApp server = new ServerApp();
        while(true)
        {
                server.sendMessage();
        }

    }

    public void sendMessage()
    {
        String advice;
        try
        {
            Socket socket = serverSocket.accept();//here comes my question
            System.out.println(socket.getPort());
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream());

            advice = getAdvice();
            printWriter.write(advice);

            printWriter.close();
            System.out.println(advice);
        }catch (Exception exception)
        {
            exception.printStackTrace();
        }
    }

    private String getAdvice() {
        int random = (int) (Math.random() * advices.length);
        return advices[random];
    }
}

服务器从同一个端口号监听和应答客户端不是很正常吗?

【问题讨论】:

    标签: java sockets networking port


    【解决方案1】:

    如果您希望从已连接的套接字中取回值 4245(您的服务器套接字正在侦听的端口),则需要 getLocalPort,而不是 getPort

    getPort:

    返回此套接字连接到的远程端口号。

    getLocalPort:

    返回此套接字绑定到的本地端口号。

    (我的重点)

    【讨论】:

    • @Crowder,所以你的意思是客户端机器端口,说这个套接字连接的远程端口,对吧?
    • @1linecode:对。一个套接字连接到两端的端口。 (您可能知道。)从服务器的角度来看,客户端计算机的端口是“远程”的,因此客户端套接字的本地端口将是服务器上的端口,服务器套接字正在侦听该端口。 getPort 为您提供客户端计算机上的 remote 端口,该端口不太可能相同(并且会因连接而异,即使来自同一台机器)。
    • @Crowder,谢谢先生。
    【解决方案2】:

    为什么一个ServeerSocket对象的accept()方法返回一个监听服务器机器不同端口的Socket对象

    它没有。您正在查看的是客户端的远程端口。本地端口由getLocalPort(), 给出,与ServerSocket's. 相同

    NB 只有ServerSocket 正在“听”。接受的Socket连接,并准备好进行 I/O。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 2020-02-03
      • 2013-11-28
      • 2014-08-11
      • 1970-01-01
      相关资源
      最近更新 更多