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日

相关文章

  • python列表复制

    Python列表复制 在Python中,列表是一种常见的数据类型。当我们需要复制一个列表时,可以使用以下几种方法。 1. 使用切片方法 使用切片方法可以复制一个完整的列表。例如: a = [1, 2, 3] b = a[:] print(b) # [1, 2, 3] 这里的a[:]表示从列表a的第一个元素开始复制到最后一个元素,相当于复制了整个列表。 2. …

    其他 2023年3月28日
    00
  • 详解批处理文件语法

    详解批处理文件语法 批处理文件是Windows操作系统中的一种脚本文件, 可以通过命令行方式执行一系列命令, 用于进行批量处理。 一般来说, 批处理文件的扩展名为.bat或.cmd, 文件开头一般需要添加@echo off命令, 以隐藏执行过程中的命令行窗口和输出内容。 以下是批处理文件的基本语法: @echo off REM 这里是注释,在脚本中不会被执行…

    other 2023年6月26日
    00
  • 黑客攻击数据库的六大手段

    黑客攻击数据库的六大手段 数据库作为网站的重要组成部分,是黑客攻击的重点目标之一。黑客利用各种手段来攻击数据库,获取网站敏感信息,造成严重后果。以下介绍黑客攻击数据库的六大手段以及相应的防范措施。 1. SQL注入攻击 SQL注入攻击是通过在输入框中输入恶意SQL语句,使得数据库执行非预期的操作而导致数据泄露或者系统瘫痪。黑客通常通过输入一些特殊字符(如单引…

    other 2023年6月27日
    00
  • springboot项目如何在linux服务器上启动、停止脚本

    Spring Boot项目在Linux服务器上启动、停止脚本的完整攻略 以下是在Linux服务器上启动和停止Spring Boot项目的完整步骤: 启动脚本 创建一个新的Shell脚本文件,例如start.sh。 在脚本文件中添加以下内容: #!/bin/bash # 定义项目路径 PROJECT_DIR=/path/to/your/project # 进入…

    other 2023年10月13日
    00
  • 微信小程序实现双层嵌套菜单栏

    activeMenuIndex: 0, activeSubMenuIndex: 0 }, handleMenuClick(e) { const { index } = e.currentTarget.dataset; this.setData({ activeMenuIndex: index }); }, handleSubMenuClick(e) { co…

    other 2023年7月28日
    00
  • 大漠游戏脚本实例

    大漠游戏脚本实例 大漠是一个著名的自动化测试工具,不仅可以用于一些常见的自动化测试场景,也可以用于一些游戏脚本自动化测试。本文将介绍如何使用大漠进行游戏脚本自动化测试,为读者提供一个大漠游戏脚本实例。 安装大漠插件 首先,需要安装大漠插件,可以在大漠官网下载:https://ourcoders.com/thread/show/39128。根据官网提供的安装步…

    其他 2023年3月28日
    00
  • PHP 得到根目录的 __FILE__ 常量

    获取根目录的__FILE__常量是在PHP中获取项目根目录路径的常见方法。下面是获取根目录的__FILE__常量的完整攻略: 1.理解__FILE__常量 __FILE__是在运行脚本时自动定义的常量,代表当前文件的绝对路径以及文件名。在PHP中,__FILE__常量包含了当前文件的完整路径,因此可以通过__FILE__常量解析项目根目录的路径。 2.获取根…

    other 2023年6月27日
    00
  • C语言数据结构创建及遍历十字链表

    C语言数据结构创建及遍历十字链表 什么是十字链表 十字链表是一种二维数据结构,常用于表示稀疏矩阵,它是在链式储存结构的基础上,将正反两个方向都链起来,形成一个交叉的链表。 十字链表的创建 在创建十字链表时,我们需要定义两种结构: //行结点 typedef struct CrossRowNode{ int row; //行下标 int col; //列下标 …

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