【发布时间】:2015-02-14 10:47:54
【问题描述】:
注意:我在这里发现了一个类似的问题:
How to close port after using server sockets
但是没有找到满意的答案。
这是我的客户端程序代码:
package hf;
import java.io.*;
import java.net.*;
public class DailyAdviceClient
{
private static final int chatPort = 4242;
public static void main(String[] args)
{
DailyAdviceClient client = new DailyAdviceClient();
client.go();
}
private void go()
{
try
{
Socket socket = new Socket("127.0.0.1",chatPort);
InputStreamReader inputStream = new InputStreamReader(socket.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputStream);
String advice = bufferedReader.readLine();
System.out.println("Advice received by the client for today is "+advice);
bufferedReader.close();
}
catch(Exception e)
{
System.out.println("Failed to connect to the server");
}
}
}
这是服务器程序的代码:
package hf;
import java.io.*;
import java.net.*;
public class DailyAdviceServer
{
private String[] adviceList = {"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."};
private static final int chatPort = 4242;
public static void main(String[] args)
{
DailyAdviceServer server = new DailyAdviceServer();
server.go();
}
private void go()
{
try
{
ServerSocket serverSocket = new ServerSocket(chatPort);
while(true)
{
Socket socket = serverSocket.accept();
PrintWriter writer = new PrintWriter(socket.getOutputStream());
String advice = getTodaysAdvice();
writer.println(advice);
writer.close();
}
}
catch(Exception e)
{
System.out.println("Error in establishing connection with the client");
}
}
private String getTodaysAdvice()
{
String advice = null;
int randomIndex = (int) (Math.random()*adviceList.length);
advice = adviceList[randomIndex];
return advice;
}
}
在应用程序中,每当客户端程序连接到服务器程序时,它都会收到一个包含当天建议的字符串。
当我跑步时
netstat -an
在我的 Windows 计算机的命令提示符中,如上述链接中的一个答案所建议的那样,我收到一条消息,端口 4242 是
LISTENING
如何关闭端口并使其可供将来重复使用?
【问题讨论】:
-
只要服务器在运行,端口就会打开,直到有人停止服务器。完成读取或写入后,您应该使用 socket.close() 关闭服务器和客户端的套接字;但是这行 ServerSocket serverSocket = new ServerSocket(chatPort);将始终保留服务器使用的端口
-
@MihaiC 不,不会。它将一直监听,直到服务器套接字关闭或进程退出。 “总是”是很长的时间。
-
@Luke OMG 另一个。那不是仅链接的答案。你读了吗?
-
@EJP 这正是我所说的。 “直到有人停止服务器”= 进程退出,并且“ServerSocket serverSocket = new ServerSocket(chatPort);”将保持打开状态,直到 serversocket 关闭...
-
@MihaiC '将始终保留该服务器使用的端口' '正是你所说的',这正是我所评论的。
标签: java sockets networking server