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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:48:33