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

下面是针对“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日

相关文章

  • 办公室IP地址如何设置?规划办公室的网络地址(项目建设)

    办公室IP地址设置攻略 1. 确定网络需求 在规划办公室的网络地址之前,首先需要确定办公室的网络需求。这包括确定需要连接的设备数量、网络带宽要求以及网络安全需求等。 2. 设计IP地址方案 根据网络需求,设计一个合适的IP地址方案是非常重要的。以下是一个示例IP地址方案: 子网划分 根据办公室的规模和设备数量,可以将办公室的网络划分为多个子网。每个子网可以容…

    other 2023年7月30日
    00
  • 超星尔雅12倍速播放脚本

    当然,我很乐意为您提供“超星尔雅12倍速播放脚本”的完整攻略。以下是详细的步骤和示例说明: 安装脚本 要安装“超星尔雅12倍速播放脚本”,需要先安装Tampermonkey插件。Tampermonkey是一款浏览器插件,可以用于管理用户脚本。以下是安装Tampermonkey的步: 打开浏览器,访问Tampermonkey官网(https://www.tam…

    other 2023年5月8日
    00
  • Vue中插槽slot的使用方法与应用场景详析

    当然!下面是关于\”Vue中插槽(slot)的使用方法与应用场景详析\”的完整攻略,包含两个示例说明。 … Vue中插槽(slot)的使用方法与应用场景详析 Vue中的插槽(slot)是一种强大的组件化技术,它允许我们在组件中定义一些占位符,然后在使用组件时填充具体的内容。下面是插槽的几种使用方法与应用场景的详细分析: … 示例1:默认插槽 默认插槽…

    other 2023年8月20日
    00
  • Qt股票组件之自选股列表拖拽、右键常用菜单功能的实现

    我们来详细讲解一下“Qt股票组件之自选股列表拖拽、右键常用菜单功能的实现”的完整攻略。 一、拖拽功能的实现 拖拽是一种非常常见的操作,在使用股票组件时也需要实现拖拽功能,例如可以对自选股列表中的股票拖拽到其他位置。 Qt提供了拖拽操作的相关类,我们可以重载QWidget的mousePressEvent、mouseMoveEvent和dragEnterEven…

    other 2023年6月27日
    00
  • Android实现双层ViewPager嵌套

    Android实现双层ViewPager嵌套攻略 在Android开发中,有时候我们需要实现双层ViewPager嵌套的效果,即一个ViewPager中包含多个子ViewPager。下面是一个详细的攻略,帮助你实现这个功能。 步骤一:添加依赖 首先,在你的项目中添加以下依赖: implementation ‘androidx.viewpager2:viewp…

    other 2023年7月28日
    00
  • Win10内置杀软Windows Defender怎么从右键菜单扫描项去掉?

    要从 Win10 内置的杀软 Windows Defender 的右键菜单扫描项中去掉,可以按照以下步骤进行: 打开注册表编辑器。 在注册表中定位到:HKEY_CLASSES_ROOT*\shellex\ContextMenuHandlers\WindowsDefender。 将 WindowsDefender 键下的 ShellFolder 子键删除。 关…

    other 2023年6月27日
    00
  • 台式机电脑总是自动关机重启该怎么解决?

    台式机电脑总是自动关机重启该怎么解决? 问题描述 当台式机电脑出现自动关机重启的情况时,通常表现为突然关闭并自动重启。这种情况会给用户带来极大的不便,严重的甚至会导致数据丢失和硬件损坏。 解决方案 针对台式机电脑自动关机重启的情况,可以尝试以下几种解决方案: 1. 检查电源 首先检查电源供应是否正常,如果电源不足或者电源出现问题,可能会导致电脑重启。可以尝试…

    other 2023年6月26日
    00
  • 深入理解C语言的逻辑控制

    深入理解C语言的逻辑控制攻略 在C语言中,逻辑控制是一种非常重要的编程技巧。它通过精细的逻辑构造和控制,实现程序的灵活性和可读性,提高程序效率和代码质量。本文将深入探讨C语言中的逻辑控制,包括条件语句、循环语句、跳转语句以及宏定义等内容,为C语言初学者提供全面的学习指南和编程实践。 一、条件语句 条件语句是C语言中最基础的逻辑控制语句。它根据条件的真假,选择…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部