Android编程之客户端通过socket与服务器通信的方法

我们先来介绍一下 Android 编程中使用 Socket 与服务器进行通信的方法。

什么是 Socket?

Socket,即“套接字”,是一种网络通信的方式。在进行网络通信时,程序之间需要建立起通信链路,Socket 就是建立该通信链路所使用的一种方法。在 Android 编程中,可以使用 Socket 进行与服务器的通信,使得客户端与服务器之间可以进行数据的交换。

Android 中使用 Socket 进行通信

在 Android 中使用 Socket 进行通信的基本步骤如下:

  1. 创建 Socket 对象
  2. 建立连接
  3. 发送数据
  4. 接收数据
  5. 关闭连接

下面我们来详细介绍每个步骤的具体实现方法。

1. 创建 Socket 对象

在 Android 中,可以使用 Java 中的 Socket 类来创建 Socket 对象。创建方式为:

Socket socket = new Socket(ip, port);

其中,ip 为服务器的 IP 地址,port 为服务器的端口号。通过这个语句,就可以创建一个 Socket 对象。

2. 建立连接

Socket 对象创建完毕后,可以通过调用 connect() 方法来建立与服务器的连接。代码示例:

socket.connect(new InetSocketAddress(ip, port), timeout);

其中,ip 是服务器的 IP 地址,port 是服务器的端口号,timeout 是连接的超时时间,单位为毫秒。

3. 发送数据

连接建立之后,可以通过 OutputStream 对象来向服务器发送数据。代码示例:

String message = "Hello, server!";
OutputStream os = socket.getOutputStream();
os.write(message.getBytes());

其中,message 是要发送的消息,os 是通过 Socket 对象获取到的 OutputStream 对象。

4. 接收数据

向服务器发送完消息后,可以通过 InputStream 对象来接收服务器返回的消息。代码示例:

InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int count = is.read(buffer);
String response = new String(buffer, 0, count);

其中,is 是通过 Socket 对象获取到的 InputStream 对象,buffer 是用来存储接收数据的字节数组,count 是实际接收到的字节数,response 是服务器返回的消息。

5. 关闭连接

通信完成后,需要关闭连接。代码示例:

socket.close();

这样就可以关闭连接,释放资源。

示例介绍

下面我们来介绍两个使用 Socket 与服务器进行通信的示例。

示例1:获取服务器时间

客户端发送请求给服务器,服务器返回当前的时间。具体代码如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private static final String SERVER_IP = "192.168.1.100";
    private static final int SERVER_PORT = 12345;

    private TextView mResponseTv;

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

        mResponseTv = findViewById(R.id.tv_response);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket(SERVER_IP, SERVER_PORT);

                    InputStream is = socket.getInputStream();
                    byte[] buffer = new byte[1024];
                    int count = is.read(buffer);
                    String response = new String(buffer, 0, count);

                    mResponseTv.setText(response);

                    socket.close();
                } catch (IOException e) {
                    Log.e(TAG, "run: ", e);
                }
            }
        }).start();
    }
}

示例2:与服务器进行聊天

客户端与服务器进行聊天,客户端输入消息发送给服务器,服务器返回相同的消息。具体代码如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private static final String SERVER_IP = "192.168.1.100";
    private static final int SERVER_PORT = 12345;

    private EditText mMessageEt;
    private ListView mChatLv;
    private ChatListAdapter mAdapter;

    private List<String> mChatList = new ArrayList<>();

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

        mMessageEt = findViewById(R.id.et_message);
        mChatLv = findViewById(R.id.lv_chat);

        mAdapter = new ChatListAdapter(this, mChatList);
        mChatLv.setAdapter(mAdapter);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket(SERVER_IP, SERVER_PORT);

                    while (true) {
                        InputStream is = socket.getInputStream();
                        byte[] buffer = new byte[1024];
                        int count = is.read(buffer);
                        String response = new String(buffer, 0, count);
                        mChatList.add("Server: " + response);

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                mAdapter.notifyDataSetChanged();
                                mChatLv.setSelection(mChatList.size() - 1);
                            }
                        });
                    }
                } catch (IOException e) {
                    Log.e(TAG, "run: ", e);
                }
            }
        }).start();
    }

    public void sendMessage(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket(SERVER_IP, SERVER_PORT);

                    String message = mMessageEt.getText().toString();
                    OutputStream os = socket.getOutputStream();
                    os.write(message.getBytes());

                    InputStream is = socket.getInputStream();
                    byte[] buffer = new byte[1024];
                    int count = is.read(buffer);
                    String response = new String(buffer, 0, count);
                    mChatList.add("Client: " + response);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mMessageEt.setText("");
                            mAdapter.notifyDataSetChanged();
                            mChatLv.setSelection(mChatList.size() - 1);
                        }
                    });
                } catch (IOException e) {
                    Log.e(TAG, "run: ", e);
                }
            }
        }).start();
    }
}

这两个示例分别演示了客户端与服务器之间进行通信的两种情况。具体实现中,我们创建了 Socket 对象,并且利用 InputStreamOutputStream 对象来进行数据的接收和发送,使得客户端与服务器之间达到了数据的互通。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android编程之客户端通过socket与服务器通信的方法 - Python技术站

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

相关文章

  • Golang判断两个链表是否相交的方法详解

    Golang判断两个链表是否相交的方法详解 在判断两个链表是否相交的时候,可以使用双指针的方法实现。 双指针方法 首先需要定义两个指针,分别指向两个链表的头结点,然后同时遍历两个链表,直到到达它们的尾部。如果两个链表相交,那么它们在相交点之后的结点都是相同的,因此在遍历结束前,两个指针必定会指向同一个结点。 请参考下面的代码示例: type ListNode…

    other 2023年6月27日
    00
  • 中文版Win10预览版9879官方ISO镜像下载地址(附安装教程)

    中文版Win10预览版9879官方ISO镜像下载地址(附安装教程) 1. 下载镜像文件 首先,你需要下载中文版Win10预览版9879的官方ISO镜像文件。你可以通过以下步骤进行下载: 步骤一:打开你的浏览器,访问微软官方网站。 步骤二:在搜索框中输入“中文版Win10预览版9879官方ISO镜像下载”,然后按下回车键进行搜索。 步骤三:在搜索结果中找到微软…

    other 2023年8月4日
    00
  • vue使用vuedraggable实现嵌套多层拖拽排序功能

    Vue使用vuedraggable实现嵌套多层拖拽排序功能攻略 1. 安装vuedraggable 首先,我们需要安装vuedraggable插件。在终端中运行以下命令: npm install vuedraggable 2. 导入vuedraggable 在需要使用vuedraggable的组件中,导入vuedraggable插件: import drag…

    other 2023年7月28日
    00
  • PhpStorm配置Xdebug调试的方法步骤

    当开发 PHP 应用程序时,调试比较重要,Xdebug就是一种常用的 PHP 扩展,它能够提供高效的 PHP 代码调试,在 PhpStorm 中配置 Xdebug 调试就能够大大提高开发效率。 下面我将详细讲解如何配置 PhpStorm 使用 Xdebug 进行 PHP 代码调试。 步骤一:安装 Xdebug 要使用 Xdebug 进行 PHP 代码调试,首…

    other 2023年6月27日
    00
  • 汇编语言功能字符串大小写转换实现实例详解

    汇编语言功能字符串大小写转换实现实例详解 本攻略将详细讲解如何使用汇编语言实现字符串大小写转换的功能。我们将使用x86架构的汇编语言进行示例说明。 1. 简介 字符串大小写转换是一种常见的字符串处理操作,它可以将字符串中的字母从大写转换为小写,或者从小写转换为大写。在汇编语言中,我们可以通过操作字符串的ASCII码来实现这一功能。 2. 实现步骤 下面是实现…

    other 2023年8月16日
    00
  • C++程序内存栈区与堆区模型案例分析

    C++程序内存栈区与堆区模型案例分析 介绍 在C++程序中,内存分为栈区和堆区。栈区用于存储局部变量和函数调用的上下文信息,而堆区用于动态分配内存。了解栈区和堆区的模型对于正确管理内存和避免内存泄漏非常重要。本攻略将详细讲解C++程序内存栈区与堆区模型,并提供两个示例说明。 栈区 栈区是一块连续的内存空间,用于存储局部变量和函数调用的上下文信息。栈区的分配和…

    other 2023年8月2日
    00
  • vue右键菜单的简单封装

    针对“vue右键菜单的简单封装”,我会提供以下完整攻略,帮助你更好地理解: 1. 首先介绍vue-contextmenu组件 vue-contextmenu 是基于Vue.js的右键菜单组件,可帮助我们快速创建自定义的右键菜单。该组件的特点包括: 右键菜单是命令式的,可以方便的控制每一个条目的行为。 提供了简单的API,便于开发者自定义右键菜单的样式和行为。…

    other 2023年6月27日
    00
  • Mysql存储过程循环内嵌套使用游标示例代码

    当在MySQL中使用存储过程时,有时候需要在循环内嵌套使用游标来处理数据。下面是一个完整的攻略,详细讲解了如何在MySQL存储过程中嵌套使用游标,并提供了两个示例说明。 准备工作 在开始之前,确保你已经创建了一个包含需要处理的数据的表。在这个示例中,我们将使用一个名为employees的表,其中包含id和name两个列。 示例1:使用游标遍历数据 首先,我们…

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