05-07 05:03:34.722: W/System.err(550): java.net.ConnectException: localhost/127.0.0.1:8088 - Connect

本文介绍了解决Android模拟器无法访问电脑本地服务的问题。当尝试从模拟器访问localhost时,会遇到连接被拒绝的错误。文章给出了正确的解决方案:使用特定的IP地址10.0.2.2来代替localhost,从而实现模拟器与电脑之间的网络通信。
调试中通过android simulator模拟器链接localhost或者127.0.0.1,因为我在电脑上面建立了apache,我的代码大概就是
URL url = new URL(urlString);
    URLConnection urlconn = url.openConnection();

但是报错了!!

Exception 1:java.net.ConnectException: localhost/127.0.0.1:8080 -
Connection refused

问题是这样的,android模拟器(simulator)把它自己作为了localhost,也就是说,代码中使用localhost或者127.0.0.1来访问,都是访问模拟器自己!这是不行的!

如果你想在模拟器simulator上面访问你的电脑,那么就使用android内置的IP 10.0.2.2 吧,  10.0.2.2 是模拟器设置的特定ip,是你的电脑的别名alias

记住,在模拟器上用10.0.2.2访问你的电脑本机

package 网络.核心类; import java.net.*; import java.io.*; import java.util.Scanner; public class Client { public static void main(String[] args) { try (Socket socket = new Socket("localhost", 12345); // 连接到服务器的IP和端口 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 用于发送数据 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 用于接收数据 Scanner scanner = new Scanner(System.in)) { // 用于读取键盘输入 System.out.println("Connected to server. Type your message and press enter to send. Type 'exit' to quit."); while (true) { System.out.print("Client: "); String userInput = scanner.nextLine(); // 读取用户输入 if (userInput.equalsIgnoreCase("exit")) { System.out.println("Exiting client..."); break; // 退出循环 } // TODO: 扩展用户输入处理,支持不同命令(如 "echo <消息>"、"time"、"quit")。例如,提示用户可用命令并根据输入类型发送适当的消息。 // 提示:您可以在这里添加代码来解析用户输入,并修改发送逻辑。 out.println(userInput); // 通过Socket发送消息到服务器 String response = in.readLine(); // 通过Socket读取服务器响应 System.out.println("Server response: " + response); // 显示响应 // TODO: 扩展响应处理,根据服务器返回的不同响应类型进行处理(如显示时间或错误消息)。确保处理 null 或异常情况。 } } catch (IOException e) { System.err.println("Connection error: " + e.getMessage()); // 处理连接异常 } } } package 网络.核心类; import java.net.*; import java.io.*; public class Server { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(12345)) { // 绑定到端口12345 System.out.println("Server started. Listening on port 12345..."); while (true) { // 无限循环,等待客户端连接 Socket clientSocket = serverSocket.accept(); // 接受客户端连接,返回一个Socket对象 System.out.println("Client connected: " + clientSocket.getInetAddress()); // 使用Socket处理客户端通信(这里使用独立的线程处理每个客户端,避免阻塞) new Thread(() -> { try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) { String message; while ((message = in.readLine()) != null) { // 读取客户端发送的消息 System.out.println("Received from client: " + message); // TODO: 扩展消息处理逻辑,支持简单协议。例如,根据消息类型执行操作: // - 如果消息以 "echo" 开头,返回回显消息。 // - 如果消息是 "time",返回当前系统时间。 // - 如果消息是 "quit",断开连接。 // 提示:使用 if-else 语句或 switch 表达式来处理不同命令。确保处理无效命令,返回错误消息。 out.println("Echo: " + message); // 默认回显逻辑,学生需要修改此部分 } } catch (IOException e) { System.err.println("Error handling client: " + e.getMessage()); } finally { try { clientSocket.close(); // 关闭Socket } catch (IOException e) { e.printStackTrace(); } } }).start(); // 启动新线程处理客户端 } } catch (IOException e) { System.err.println("Server error: " + e.getMessage()); // 处理异常,如端口被占用 } } }补充完善上述代码
最新发布
06-12
### Java中 `java.net.UnknownHostException` 错误的原因分析 `java.net.UnknownHostException` 是一种常见的网络异常,通常表示程序尝试解析某个主机名时失败。这种错误可能由多种因素引起,包括但不限于 DNS 配置问题、本地 hosts 文件配置不当以及应用程序本身的配置失误。 #### 原因一:DNS 解析失败 当程序试图通过域名访问远程服务器时,如果该域名无法被解析成有效的 IP 地址,则会抛出此异常。这可能是由于 DNS 服务器不可用或者域名本身不存在引起的[^1]。 #### 原因二:Hosts 文件配置错误 操作系统中的 `/etc/hosts` 或 `C:\Windows\System32\drivers\etc\hosts` 文件用于映射主机名到 IP 地址。如果该文件未正确定义某些常用名称(如 `localhost`),则可能导致此类异常。例如,缺少如下条目可能会引发问题: ```plaintext 127.0.0.1 localhost ::1 localhost ``` 确保这些基本映射已正确设置可以有效避免部分场景下的未知主机异常[^2]。 #### 原因三:应用层配置问题 在分布式系统环境下,比如使用 Eureka 注册中心的服务发现机制时,如果没有显式指定服务实例绑定的具体 IP 地址而依赖于自动检测逻辑的话,在特殊网络环境中也可能遇到类似的 UnknownHostException 。此时可以通过调整相关参数来强制设定固定的IP地址从而规避风险。例如,在 Spring Cloud 应用里可通过下面的方式固定注册使用的网卡对应的公网IP[^3]: ```yaml eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://peer1:8761/eureka/,http://peer2:8761/eureka/ instance: prefer-ip-address: true ip-address: 192.168.x.x # 替换为实际可用外网可达ip ``` 以上方法适用于那些因为内部局域网环境复杂而导致的标准hostname/ip匹配流程失效的情况。 --- ### 综合解决方案 针对不同层面可能出现的问题提供相应的处理措施如下所示: 1. **确认 Hostname 是否能正常解析** 使用命令行工具 ping 测试目标 hostname 的连通性和可解析状态。 2. **修正 /etc/hosts 文件内容** 对应 Linux/MacOS 平台编辑位于路径 `/etc/hosts`; Windows 下则是 `%SystemRoot%\system32\drivers\etc\hosts`. 添加必要的本地回环定义项. 3. **优化软件自身的连接属性设置** 根据具体业务需求合理规划并实施恰当的应用级策略变更, 如前所述例子那样明确指派物理设备上的特定接口作为对外通讯端口的基础依据之一. 4. **检查防火墙及安全组规则** 如果是在云平台之上运行的应用还需要特别留意是否有额外的安全防护手段阻碍了正常的请求交互过程。 最后提醒一点就是每次做完改动之后都应该重启关联的服务进程以便让新的设定生效并且再次验证整个链路是否恢复正常工作秩序。 --- ### 示例代码片段展示如何捕获和调试该类异常 以下是简单的Java示例演示怎样优雅地应对潜在的UnknownHostException状况: ```java import java.io.IOException; import java.net.InetAddress; public class Main { public static void main(String[] args) throws IOException { String hostName = "updates.jenkins.io"; // 可替换为你关心的目标站点 try{ InetAddress address = InetAddress.getByName(hostName); System.out.println("Resolved Address:"+address.getHostAddress()); }catch (UnknownHostException ex){ System.err.printf("Could not resolve '%s': %s%n",hostName ,ex.getMessage()); throw new RuntimeException(ex); // 转化为更高级别的异常供调用方进一步处置 } } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值