You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java基于TCP实现客户端服务端模型传递IP时报NumberFormatException问题咨询

问题根因

你遇到的NumberFormatException以及代码逻辑问题主要有3处:

  • 调用InetAddress.getByName("hostname")时传入了固定字符串"hostname",无法正确获取到服务端的本地IP地址,正确应该调用InetAddress.getLocalHost()获取本机地址对象
  • 错误尝试把IP地址字符串(格式如192.168.3.4)直接转为单个byte类型,IP字符串本身不是合法的byte数值格式,直接调用Byte.parseByte必然抛出数字格式转换异常
  • 客户端逻辑是读到#字符才停止接收打印,服务端发送完IP数据后没有发送结束标记#,会导致客户端一直阻塞等待输入

修复后代码

服务端代码

package exp1;
import java.net.*;
import java.io.*;
public class MyServerSocket{
    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(2050); 
        System.out.println("server is waiting..."); 
        Socket s=ss.accept(); 
          
        // 正确获取本地地址
        InetAddress ad= InetAddress.getLocalHost();
        OutputStream os=s.getOutputStream(); 
        String localIp = ad.getHostAddress();
        System.out.println("服务端本地IP:" + localIp);
        // 转为字节数组发送,最后加结束标记#
        os.write((localIp + "#").getBytes()); 
          
        os.close();
        ss.close();
    }
}

客户端代码

package exp1;
import java.io.*;
import java.net.*;
public class MyClientSocket {
    public static void main(String[] args) throws Exception{
        Socket s=new Socket(InetAddress.getLocalHost(),2050); 
        InputStream is=s.getInputStream(); 
        System.out.println("Client is ready to receive data"); 
        int d=0; 
        while(d!='#') 
        { 
            d=is.read(); 
            if(d != '#'){
                System.out.print((char)d); 
            }
        }
        is.close();
        s.close();
    }
}

运行效果

启动服务端后再启动客户端,客户端会直接打印服务端的本地IP地址,不会再抛出异常。

内容的提问来源于stack exchange,提问作者Augustus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:15:04