Socket---简单测试和端口号获取

SocketAddress addr = new InetSocketAddress("172.20.33.70", 1080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);
Socket socket = new Socket(proxy);
InetSocketAddress dest = new InetSocketAddress("baidu.com", 80);
try {
    socket.connect(dest);
} catch (IOException e) {
    e.printStackTrace();
}

/**
 *  获得远程服务器的IP 地址.
 */
InetAddress inetAddress = socket.getInetAddress();
Log.d(TAG, "inetAddress = "+inetAddress);

/**
 * 获得远程服务器的端口.
 */
int port = socket.getPort();
Log.d(TAG, "port = "+port);

/**
 * 获得客户本地的IP 地址.
 */
InetAddress localAddress = socket.getLocalAddress();
Log.d(TAG, "localAddress = "+localAddress);

/**
 * 获得客户本地的端口.
 */
int localPort = socket.getLocalPort();
Log.d(TAG, "localPort = "+localPort);

/**
 * 获取本地的地址和端口号
 */
SocketAddress localSocketAddress = socket.getLocalSocketAddress();
Log.d(TAG, "localSocketAddress = "+localSocketAddress);

/**
 * 获得远程的地址和端口号
 */
SocketAddress remoteSocketAddress = socket.getRemoteSocketAddress();
Log.d(TAG, "remoteSocketAddress = "+remoteSocketAddress);
<think>嗯,用户遇到了LocalSocketAddress报错,错误是Connectionrefused。这个问题通常发生在客户端尝试连接到服务器端时,但服务器端没有在指定的地址端口上监听。我需要先理解LocalSocketAddress的使用场景,然后分析可能的原因。 首先,LocalSocket在Android中用于进程间通信,基于Unix域套接字。这意味着通信的两个进程必须在同一个设备上,且服务器端需要先创建并绑定到某个地址,然后开始监听。客户端才能连接。 用户遇到的错误是连接被拒绝,可能的原因有几个:服务器端没有启动,地址不正确,或者权限问题。比如,服务器端没有调用bind()或者listen(),导致客户端连接时找不到对应的服务。 接下来要检查服务器端的代码是否正确。比如,服务器端是否创建了LocalServerSocket,并绑定到相同的地址。另外,地址的命名空间是否正确?比如,使用LocalSocketAddress.Namespace.FILESYSTEM或ABSTRACT。如果命名空间不对,可能导致地址不匹配。 另外,文件系统命名空间下,套接字会创建实际的文件,需要确保应用有权限写入该路径。而ABSTRACT命名空间则不需要文件,但可能在部分系统上有不同的限制。 权限问题也可能导致连接被拒绝。例如,如果服务器端客户端属于不同的用户或应用,可能需要设置正确的文件权限,或者使用合适的命名空间。那么,解决方案应该包括检查服务器端是否正确绑定监听,确认地址一致,处理权限问题。给出一个示例代码,展示服务器端客户端的正确用法,并解释关键步骤。比如,服务器端应该创建LocalServerSocket,绑定到地址,然后等待连接。客户端创建LocalSocket,连接到同一地址。确保命名空间路径正确。此外,处理异常情况,比如地址已被占用或权限不足。可能用户没有启动服务器端,或者服务器端代码有错误,导致客户端连接时失败。这时候需要检查服务器端的日志,确认是否成功绑定,并处于监听状态。 另外,是否在连接前确保服务器端已经启动?比如,在客户端连接之前,服务器端必须先运行并开始接受连接。否则,客户端无法连接,导致Connection refused。 总结,解决步骤包括:验证服务器端是否正确绑定监听,检查地址命名空间路径,确保权限正确,处理可能的异常情况。</think>Android开发中使用LocalSocket出现"Connection refused"错误,通常是由于服务端未正确启动或地址不匹配导致的。以下是完整的解决方案: 1. **服务端代码示例**: ```java // 服务端需要先创建LocalServerSocket public void startServer() { new Thread(() -> { try { LocalServerSocket server = new LocalServerSocket("my_socket_address"); LocalSocket receiver = server.accept(); // 等待客户端连接 InputStream input = receiver.getInputStream(); // 处理输入流... } catch (IOException e) { e.printStackTrace(); } }).start(); } ``` 2. **客户端代码示例**: ```java public void connectClient() { try { LocalSocket client = new LocalSocket(); LocalSocketAddress address = new LocalSocketAddress( "my_socket_address", // 必须与服务端名称一致 LocalSocketAddress.Namespace.ABSTRACT // 命名空间类型必须一致 ); client.connect(address); // 进行通信操作... } catch (IOException e) { e.printStackTrace(); } } ``` **关键点解释**: 1. 命名空间必须一致:服务端客户端必须使用相同的`Namespace`(ABSTRACT或FILESYSTEM) 2. 服务端要先启动:确保服务端的`LocalServerSocket`已经执行accept()后再启动客户端 3. 权限问题:如果使用FILESYSTEM模式,需要确保有文件系统写权限 4. 名称规范:地址名称不能包含斜杠,建议全部小写 **常见错误排查**: - 检查服务端是否调用了`accept()`方法 - 确认客户端服务端使用完全相同的地址字符串 - 尝试使用ABSTRACT命名空间避免文件权限问题 - 确保服务端线程已成功启动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值