Java编写简单服务器后,Telnet无法连接localhost问题排查
搞定你的Java Daytime服务器连接问题
嘿,我来帮你排查下这个问题!首先咱先看代码里的一个致命小错误,这大概率是你没注意到的:Java是大小写敏感的,你import语句里的Java全写成大写了,必须改成小写的java,不然编译都通不过,更别说运行了。
先给你修正后的完整代码,顺便优化了几个细节:
import java.net.*; import java.io.*; import java.util.*; class Server{ public static void main(String[] args){ int PORT = 13; try(ServerSocket server = new ServerSocket(PORT)){ while(true){ try(Socket connection = server.accept()){ Writer out = new OutputStreamWriter(connection.getOutputStream()); Date now = new Date(); out.write(now.toString()); // 加个换行符,telnet需要这个来识别输出结束 out.write("\r\n"); out.flush(); out.close(); } catch(IOException ex){ // 别吞异常,打印出来方便排查问题 ex.printStackTrace(); } } } catch(IOException ex){ System.err.println(ex); } } }
接下来按这几步排查修复:
- 先修正代码并重新编译运行:把import里的
Java改成java,用javac Server.java编译,然后以管理员身份打开命令提示符运行java Server——因为13是系统知名端口(Daytime服务的默认端口),普通权限可能绑定失败。 - 检查端口是否被占用:打开命令提示符执行
netstat -ano | findstr ":13",要是有结果,说明这个端口被其他程序占了,要么关掉那个程序,要么把代码里的PORT改成别的(比如10013)。 - 调整输出逻辑:原代码只发了日期字符串,但telnet客户端得收到换行符才知道输出完了,不然会觉得连接出问题,所以一定要加
out.write("\r\n");这行。 - 检查Windows防火墙:确保防火墙允许你的Java程序监听13端口,或者临时关一下防火墙测试(测试完记得开回来)。
- 再试telnet连接:用管理员身份的命令提示符执行
telnet localhost 13,正常情况会立刻显示当前时间,然后连接关闭(这符合Daytime服务的设计,发完数据就断连)。要是还不行,看看服务器运行时有没有报错信息,比如绑定端口失败的提示。
另外提一句:你用了try-with-resources,Socket会自动关闭,所以原代码里的connection.close();可以删掉,避免重复关闭导致的异常。
内容的提问来源于stack exchange,提问作者Brock Lesnar




