You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动