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

Android Socket代码修改:实现向Telnet服务器发送字符串

嘿,刚上手Android Studio的话,对接Telnet服务器其实和你学的普通Socket通信路子差不多——毕竟Telnet本身就是基于TCP的文本协议,咱们只要针对性调整下Socket发送的内容就行。我给你拆解下具体的修改步骤,跟着来就好:

一、先搞定基础配置
  • 首先必须在AndroidManifest.xml里添加网络权限,不然App连不上服务器:
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 可选权限:用来判断设备当前网络状态,方便提前提示用户 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  • 划重点:Android绝对不能在主线程执行网络操作,所以所有Socket相关的代码都要放到子线程里,比如用Thread、AsyncTask或者Kotlin的Coroutine,新手先用Thread入门最容易。
二、修改Socket代码对接Telnet服务器

Telnet默认端口是23,连接时要指定服务器的IP和对应端口(如果服务器改了端口就用实际的)。另外,大部分Telnet服务器需要用\r\n作为命令的结束符,不然可能识别不到你的指令,这个要注意。

假设你原来的Socket示例是基础的TCP连接代码,改成Telnet版本大概是这样(Java版):

// 把这段代码放到子线程里执行
new Thread(new Runnable() {
    @Override
    public void run() {
        Socket socket = null;
        OutputStream outputStream = null;
        InputStream inputStream = null;
        try {
            // 替换成你的Telnet服务器IP和端口(默认是23)
            String serverIp = "192.168.1.100";
            int port = 23;
            
            // 建立Socket连接
            socket = new Socket(serverIp, port);
            
            // 获取输出流,用来发送指令
            outputStream = socket.getOutputStream();
            // 替换成你要发送的特定字符串,记得加\r\n作为Telnet命令结束符
            String targetCommand = "你的特定操作指令\r\n";
            outputStream.write(targetCommand.getBytes("UTF-8"));
            outputStream.flush(); // 强制把缓存里的数据发送出去
            
            // 如果需要接收服务器的返回结果,可以加这段逻辑
            inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int readLength = inputStream.read(buffer);
            String serverResponse = new String(buffer, 0, readLength, "UTF-8");
            // 把返回结果传到主线程更新UI(比如显示在TextView里)
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // textView.setText(serverResponse);
                }
            });
            
        } catch (IOException e) {
            e.printStackTrace();
            // 处理异常,比如连接失败、发送失败,记得回到主线程提示用户
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // Toast.makeText(MainActivity.this, "连接或发送失败", Toast.LENGTH_SHORT).show();
                }
            });
        } finally {
            // 最后一定要关闭资源,避免内存泄漏
            try {
                if (inputStream != null) inputStream.close();
                if (outputStream != null) outputStream.close();
                if (socket != null) socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}).start();

如果是用Kotlin开发,思路完全一致,用Coroutine会更简洁:

// 借助lifecycleScope确保在页面销毁时自动取消任务
lifecycleScope.launch(Dispatchers.IO) {
    try {
        val socket = Socket("192.168.1.100", 23)
        socket.getOutputStream().use { output ->
            val targetCommand = "你的特定操作指令\r\n"
            output.write(targetCommand.toByteArray(Charsets.UTF_8))
            output.flush()
        }
        // 接收返回结果的逻辑
        socket.getInputStream().use { input ->
            val buffer = ByteArray(1024)
            val readLength = input.read(buffer)
            val serverResponse = String(buffer, 0, readLength, Charsets.UTF_8)
            withContext(Dispatchers.Main) {
                // textView.text = serverResponse
            }
        }
        socket.close()
    } catch (e: IOException) {
        e.printStackTrace()
        withContext(Dispatchers.Main) {
            Toast.makeText(this@MainActivity, "连接或发送失败", Toast.LENGTH_SHORT).show()
        }
    }
}
三、几个关键注意事项
  • 测试时如果用模拟器连接本地Telnet服务器,要把IP换成10.0.2.2(这是模拟器映射本机的地址),不能直接用localhost或者本机IP
  • 如果服务器需要登录验证(比如用户名+密码),要按照服务器要求的顺序发送指令:先发用户名加\r\n,再发密码加\r\n
  • 可以先通过电脑上的Telnet客户端(比如Windows的cmd输入telnet 服务器IP 端口)测试指令是否有效,确认指令没问题再写到代码里

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:39:51