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
相关产品推荐
相关产品推荐

