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

