Android中实现Socket向服务器发送数据及发送按钮编码方法
在Android中创建Socket并向服务器发送数据的实现方案
我来帮你把整个流程理清楚,包括你提到的Client类完善,以及发送按钮buttonSend的具体代码实现,直接上手就能用~
一、完善后的Client.java(客户端Socket工具类)
这个类负责处理Socket的连接、数据发送和服务器响应接收,用AsyncTask来规避Android主线程不能做网络操作的限制:
package com.androidsrc.client; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import android.os.AsyncTask; import android.widget.TextView; public class Client extends AsyncTask<String, Void, String> { private String serverIp; private int serverPort; private TextView responseTv; private Socket socket; // 构造方法:传入服务器IP、端口和显示响应的TextView public Client(String serverIp, int serverPort, TextView responseTv) { this.serverIp = serverIp; this.serverPort = serverPort; this.responseTv = responseTv; } @Override protected String doInBackground(String... params) { String sendData = params[0]; try { // 1. 创建Socket连接服务器 socket = new Socket(serverIp, serverPort); // 2. 获取输出流,向服务器发送数据 OutputStream outputStream = socket.getOutputStream(); outputStream.write(sendData.getBytes()); outputStream.flush(); // 3. 获取输入流,接收服务器响应(如果不需要响应可以跳过这部分) InputStream inputStream = socket.getInputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, length); } return byteArrayOutputStream.toString(); } catch (UnknownHostException e) { return "无法连接到指定服务器:" + e.getMessage(); } catch (IOException e) { return "网络异常:" + e.getMessage(); } finally { // 4. 关闭Socket连接 try { if (socket != null && !socket.isClosed()) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } @Override protected void onPostExecute(String result) { super.onPostExecute(result); // 将服务器响应显示到TextView上 responseTv.setText("服务器响应:" + result); } }
二、MainActivity中buttonSend的点击事件实现
接下来在MainActivity里,你只需要初始化Client对象,然后在按钮点击时调用它的execute()方法传入要发送的数据即可:
1. 先准备布局(activity_main.xml)
确保布局里有输入框、发送按钮和显示响应的TextView:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <EditText android:id="@+id/et_send_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入要发送的内容"/> <Button android:id="@+id/buttonSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送数据"/> <TextView android:id="@+id/tv_response" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp"/> </LinearLayout>
2. MainActivity.java的代码实现
package com.androidsrc.client; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private EditText etSendContent; private TextView tvResponse; // 替换成你的服务器IP和端口 private static final String SERVER_IP = "192.168.1.100"; private static final int SERVER_PORT = 8080; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etSendContent = findViewById(R.id.et_send_content); tvResponse = findViewById(R.id.tv_response); Button buttonSend = findViewById(R.id.buttonSend); // 设置发送按钮的点击事件 buttonSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String sendData = etSendContent.getText().toString().trim(); if (!sendData.isEmpty()) { // 创建Client对象并执行发送任务 new Client(SERVER_IP, SERVER_PORT, tvResponse).execute(sendData); } else { tvResponse.setText("请输入要发送的内容"); } } }); } }
三、关键注意事项
- 网络权限:记得在
AndroidManifest.xml里添加网络权限:<uses-permission android:name="android.permission.INTERNET"/> - 服务器IP和端口:要确保你的Android设备和服务器在同一局域网内,并且服务器的端口是开放的,能正常接收Socket连接。
- AsyncTask的替代:如果你用的是Android 11及以上版本,
AsyncTask已经被标记为废弃,你可以用Coroutine或者ExecutorService来替代,不过上面的代码在低版本里依然可以正常运行。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

