我搜索了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];
}
}
服务器是否正常侦听并从同一端口号回答客户端?
答案 0 :(得分:2)
如果您希望从连接的套接字返回值4245(服务器套接字正在侦听的端口),则需要getLocalPort
,而不是getPort
。
返回此套接字连接的远程端口号。
返回此套接字绑定的本地端口号。
(我的重点)
答案 1 :(得分:0)
为什么ServeerSocket对象的accept()方法返回侦听服务器计算机上不同端口的Socket对象
没有。您正在查看的是客户端的远程端口。本地端口由getLocalPort(),
提供,与ServerSocket's.
NB只有ServerSocket
正在“倾听”。已接受的Socket
已连接,已为I / O做好准备。