Android开发之Socket通信传输简单示例

yizhihongxing

下面是针对“Android开发之Socket通信传输简单示例”的完整攻略:

1. 简介

本示例将介绍如何使用Android开发中的Socket通信来进行数据传输,其中Android作为客户端发送数据,Java服务器进行接收和处理数据。

2. 创建服务器端

首先,我们需要在Java中创建一个服务器端,用于接收来自Android客户端的数据。代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(7777);

        System.out.println("等待客户端连接。。。");

        Socket client = serverSocket.accept();

        System.out.println("客户端已连接");

        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

        String msg = in.readLine();

        System.out.println("收到客户端发来的消息:" + msg);

        in.close();
        client.close();
        serverSocket.close();
    }
}

这段代码创建了一个在端口号为7777的服务器监听连接请求。如果客户端连接成功,就接收并输出客户端发送的消息。

3. 创建客户端

接下来,我们需要在Android中创建一个客户端,用于连接服务器和发送数据。

首先,在AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />

然后,在MainActivity中添加以下代码:

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    private Button sendBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sendBtn = findViewById(R.id.send_btn);
        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new SocketTask().execute(); //执行异步任务,连接服务器并发送数据
            }
        });
    }

    private class SocketTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {

            try {
                Socket socket = new Socket("192.168.1.100", 7777); //连接服务器
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                out.write("Hello Server"); //发送数据
                out.flush();
                out.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }
    }
}

这段代码创建了一个异步任务,用于连接服务器并发送数据。其中,SocketTask中的doInBackground()方法是异步执行的,用于连接服务器和发送数据。你需要根据实际情况修改其中的IP地址和端口号,确保其与服务器端的监听一致。

4. 运行程序

现在可以运行程序了,首先启动Java服务器端,然后在Android客户端中点击发送按钮,即可将数据发送到服务器端。

5. 示例说明

示例1:多客户端连接服务器

如果需要支持多个客户端同时连接服务器端,并实现数据传输,则需要将服务器端的代码进行修改以实现多线程。示例代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(7777);
        int count = 0;

        System.out.println("等待客户端连接。。。");

        while (true) {
            Socket client = serverSocket.accept();
            count++;
            System.out.println("客户端" + count + "已连接");
            new Thread(new ServerThread(client, count)).start();
        }
    }
}

class ServerThread implements Runnable {

    private Socket client;
    private int clientNum;

    public ServerThread(Socket client, int clientNum) {
        this.client = client;
        this.clientNum = clientNum;
    }

    @Override
    public void run() {

        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            String msg;

            while ((msg = in.readLine()) != null) {
                System.out.println("客户端" + clientNum + "发送消息:" + msg);
            }

            in.close();
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

其中,ServerThread为服务器端多线程的处理类,用于实现多个客户端的连接。

示例2:客户端接收服务器端发送的数据

如果需要实现客户端接收服务器端发送的数据,则需要在Android客户端中添加接收数据的代码。示例代码如下:

private class SocketTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... voids) {

        try {
            Socket socket = new Socket("192.168.1.100", 7777); //连接服务器
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String msg = in.readLine(); //接收数据
            in.close();
            socket.close();
            return msg;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        //在UI线程更新UI界面,显示服务器端发送的数据
        Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
    }
}

其中,SocketTask中的doInBackground()方法用于连接服务器和接收数据,而onPostExecute()方法则用于在UI线程更新UI界面,显示服务器端发送的数据。

以上就是有关“Android开发之Socket通信传输简单示例”的完整攻略了,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android开发之Socket通信传输简单示例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • CentOS中环境变量与配置文件的深入讲解

    CentOS中环境变量与配置文件的深入讲解 什么是环境变量? 环境变量是指在操作系统中用于指定操作系统运行环境的变量。这些变量储存在操作系统的内核空间或者用户空间,用于配置与系统运行相关的各种参数,比如路径、编译器等。 如何设置环境变量? 在CentOS中,我们可以通过以下两种方式来设置环境变量: 1. 使用export命令 我们可以使用export命令来将…

    other 2023年6月27日
    00
  • html代码中的空格和空行

    HTML代码中的空格和空行 在编写HTML代码时,不仅要注意标签的正确使用,还需要注意空格和空行的合理使用,这有助于提高代码的可读性、易维护性和网页的访问速度。 空格的使用 在HTML代码中,需要使用空格来区分标签、属性、属性值等。 标签和属性之间的空格 HTML标签和属性之间需要一个空格来分隔,例如: <a href="https://ww…

    其他 2023年3月28日
    00
  • Python深入学习之闭包

    Python深入学习之闭包攻略 什么是闭包? 在Python中,闭包是指一个函数对象,它可以访问并修改其作用域外的变量。换句话说,闭包是一个函数和与其相关的引用环境的组合。 闭包的特点 闭包函数可以访问外部函数的变量,即使外部函数已经执行完毕。 闭包函数可以修改外部函数的变量的值。 闭包函数可以将外部函数的变量作为返回值。 闭包的应用场景 闭包在Python…

    other 2023年8月20日
    00
  • 三大Win10新累积更新KB3206632/KB3205383/KB3205386补丁推送 附修复内容

    三大Win10新累积更新KB3206632/KB3205383/KB3205386补丁推送 附修复内容攻略 简介 最近,微软推出了三个重要的累积更新补丁,分别是KB3206632、KB3205383和KB3205386。这些补丁旨在修复一些Windows 10操作系统中的问题和漏洞,并提供更好的性能和稳定性。本攻略将详细介绍这三个补丁的安装过程和修复内容。 …

    other 2023年8月3日
    00
  • win11如何设置右键关机? Win11右键菜单添加快速关机选项的技巧

    下面我将详细讲解“Win11如何设置右键关机?Win11右键菜单添加快速关机选项的技巧”。 1. 准备工作 在开始添加右键关机选项之前,需要进行以下准备工作: 确保你的系统是Win11。 确保你有管理员权限,如果没有,请使用管理员帐户登录。 确保你备份了重要文件,以防被误删或损坏。 2. 打开注册表编辑器 要添加右键关机选项,需要使用注册表编辑器进行操作。按…

    other 2023年6月27日
    00
  • 高德地图车机版 最新版本V2.8.2地图数据+软件更新方法

    高德地图车机版最新版本V2.8.2地图数据+软件更新方法 如果你使用的是高德地图车机版,可以按照以下步骤进行最新版本V2.8.2地图数据和软件的更新。 步骤1:备份数据 在更新之前,建议你先备份车机上的所有数据,包括地图数据、收藏夹、历史记录和设置等,以免丢失重要数据。 步骤2:下载最新版本的地图更新包和软件更新包 在官方网站上下载最新版本的地图更新包和软件…

    other 2023年6月27日
    00
  • 最好用的web端代码文本编辑器ace

    最好用的Web端代码文本编辑器ACE 在Web端开发过程中,代码编写是必不可少的一环。因此,选择一款可靠且易于使用的代码文本编辑器显得尤为重要。在众多的 Web端代码文本编辑器中,ACE 是一种高度可定制的文本编辑器,并且具有丰富的功能和与众不同的优点。 ACE 的优点 易于定制 ACE 提供了一系列 API,使其可以完全在客户端进行定制和扩展。您可以通过插…

    其他 2023年3月28日
    00
  • mysql如何判断是不是空字符串

    MySQL如何判断是不是空字符串 在MySQL中,判断一个字段是否为空字符串在实际应用中非常常见。下面介绍几种方法。 1. 使用 = 来判断 最简单的方法是使用等号来判断一个字段是否为空字符串。例如: SELECT * FROM my_table WHERE my_column = ”; 上面这条 SQL 语句会查询 my_table 表中 my_colu…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部