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日

相关文章

  • win10占空间怎么办 win10精简功能教程

    Win10占空间怎么办 Windows 10是一个功能强大的操作系统,但它也会占用相当大的磁盘空间。如果你的硬盘空间有限,你可能需要采取一些措施来减少Win10的占用空间。下面是一些方法可以帮助你精简Win10的功能并释放磁盘空间。 1. 卸载不需要的应用程序 Win10预装了许多应用程序,而你可能并不需要它们。卸载这些不需要的应用程序可以释放一些磁盘空间。…

    other 2023年8月1日
    00
  • 详解Javascript继承的实现

    当我们需要创建一个对象并让它继承另一个对象的属性和方法时,就需要使用到继承。 Javascript中有多种继承实现方式,本篇攻略将详细讲解Javascript继承的实现过程。 什么是继承? 继承是一种面向对象编程概念,它表明了一种对象可以从另外一个对象中获取属性和方法。在Javascript中,继承是指子类(派生类)可以使用父类(基类)的属性和方法,同时子类…

    other 2023年6月27日
    00
  • 详解基于 Nuxt 的 Vue.js 服务端渲染实践

    非常感谢您对我所写的“详解基于 Nuxt 的 Vue.js 服务端渲染实践”的兴趣。下面是完整的攻略: 什么是服务端渲染(SSR) 服务器端渲染是将动态内容生成到HTML、CSS等前端文件中(称为”Server Side Rendering”(SSR)),然后再输出到前端浏览器进行渲染的一种方法。与传统的前端渲染不同,SSR可以提供更好的SEO优化和更好的页…

    other 2023年6月27日
    00
  • 基于jquery封装的一个js分页

    下面是基于jQuery封装的一个JS分页的攻略,包含以下几个步骤: 1. 目录结构 一般来说,我们需要在项目中新建一个js文件夹,然后在这个文件夹下新建一个名为paging.js的文件。 2. HTML页面 在需要分页的页面中,我们需要设置一个DOM元素作为容器,用于渲染分页条。例如,我们可以在页面底部放置一个ID为“pagination”的DIV元素。然后…

    other 2023年6月25日
    00
  • 64位下无法运行32位程序的解决方法 提示未指定提供程序,也没有指派的默认提供程序

    64位下无法运行32位程序的解决方法 在64位操作系统下,有时候会遇到无法运行32位程序的问题。这通常是因为缺少32位程序所需的运行环境或者配置不正确。下面是解决这个问题的完整攻略。 步骤一:安装32位运行环境 首先,你需要安装32位运行环境,以便能够在64位操作系统上运行32位程序。具体的步骤如下: 打开控制面板,点击\”程序\”或\”程序和功能\”。 在…

    other 2023年7月28日
    00
  • Nginx网站根目录更改及导致403 forbidden的问题解决

    以下是“Nginx网站根目录更改及导致403 forbidden的问题解决”的完整攻略。 背景 在使用Nginx搭建网站时,有时需要更改网站的根目录以适应不同的需求,但更改后可能会导致403 forbidden的问题,本攻略将介绍如何更改Nginx网站根目录并解决403 forbidden的问题。 步骤 1. 修改Nginx配置文件 打开Nginx的配置文件…

    other 2023年6月27日
    00
  • 服务器安全设置_中级篇

    服务器安全设置中级篇攻略 一、禁止使用默认用户名和密码 在现实生活中,还有很多人因为默认的用户名和密码而受到攻击,所以我们需要在部署服务器后更改默认的用户名和初始密码,确保密码的复杂性,尽量使用大小写字母、数字和特殊符号混合的密码。 示例:假如我们使用的是Linux操作系统,我们可以使用以下命令更改用户名和密码: # 更改用户名 usermod -l 新用户…

    other 2023年6月27日
    00
  • Android实现RecyclerView嵌套流式布局的详细过程

    Android实现RecyclerView嵌套流式布局的详细过程 在Android中,要实现RecyclerView嵌套流式布局,可以使用以下步骤: 步骤一:添加依赖 首先,在项目的build.gradle文件中添加以下依赖: implementation ‘com.google.android.material:material:1.4.0’ implem…

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