为什么ServerSocket Object的accept方法返回一个具有不同端口的Socket对象

时间:2014-01-15 15:28:26

标签: java sockets networking port

我搜索了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];
    }
}

服务器是否正常侦听并从同一端口号回答客户端?

2 个答案:

答案 0 :(得分:2)

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

getPort

  

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

getLocalPort

  

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

(我的重点)

答案 1 :(得分:0)

  

为什么ServeerSocket对象的accept()方法返回侦听服务器计算机上不同端口的Socket对象

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

相同

NB只有ServerSocket正在“倾听”。已接受的Socket 已连接,已为I / O做好准备。