安卓手机socket通信(服务器和客户端)

安卓手机socket通信(服务器和客户端)攻略

要实现安卓手机之间的socket通信,需要涉及到两个角色:服务器和客户端。服务器用于监听客户端的请求,客户端则向服务器发送请求并接收响应。以下是详细攻略。

创建服务器

1. 添加网络权限

在AndroidManifest.xml文件中添加网络权限:

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

2. 创建ServerSocket

使用ServerSocket可以监听客户端请求。在服务器端创建一个ServerSocket,并指定一个端口号,等待客户端连接:

try {
    ServerSocket serverSocket = new ServerSocket(8888);
    Socket socket = serverSocket.accept();
} catch (IOException e) {
    e.printStackTrace();
}

3. 接收客户端请求

当客户端连接成功时,可以通过Socket获取输入流和输出流,进行通信:

try {
    InputStream inputStream = socket.getInputStream();
    OutputStream outputStream = socket.getOutputStream();             
} catch (IOException e) {
    e.printStackTrace();
}

创建客户端

1. 添加网络权限

在AndroidManifest.xml文件中添加网络权限:

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

2. 连接服务器

客户端通过Socket连接服务器,需要指定服务器的IP地址和端口号:

try {
    Socket socket = new Socket("192.168.0.100", 8888);
} catch (IOException e) {
    e.printStackTrace();
}

3. 向服务器发送请求

客户端向服务器发送请求,可以通过输出流写入数据:

try {
    OutputStream outputStream = socket.getOutputStream();
    String message = "Hello Server!";
    byte[] bytes = message.getBytes();
    outputStream.write(bytes);
} catch (IOException e) {
    e.printStackTrace();
}

4. 接收服务器响应

客户端从服务器接收响应,可以通过输入流读取数据:

try {
    InputStream inputStream = socket.getInputStream();
    byte[] bytes = new byte[1024];
    int len;
    StringBuilder sb = new StringBuilder();
    while ((len = inputStream.read(bytes)) != -1) {
        String s = new String(bytes, 0, len);
        sb.append(s);
    }
    String response = sb.toString();
} catch (IOException e) {
    e.printStackTrace();
}

完整示例

以下是一个完整的安卓手机socket通信示例,包含服务器和客户端两部分:

服务器部分

public class ServerActivity extends AppCompatActivity {

    private static final String TAG = "ServerActivity";

    private TextView mTvMessage;

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

        mTvMessage = findViewById(R.id.tv_message);

        new Thread(() -> {
            try {
                ServerSocket serverSocket = new ServerSocket(8888);
                Log.d(TAG, "server started.");

                Socket socket = serverSocket.accept();
                Log.d(TAG, "client connected.");

                InputStream inputStream = socket.getInputStream();
                OutputStream outputStream = socket.getOutputStream();

                byte[] buffer = new byte[1024];
                int len;
                StringBuilder sb = new StringBuilder();
                while ((len = inputStream.read(buffer)) != -1) {
                    String s = new String(buffer, 0, len);
                    sb.append(s);
                }

                String request = sb.toString();
                Log.d(TAG, "request: " + request);

                String response = "Hello Client!";
                outputStream.write(response.getBytes());
                Log.d(TAG, "response: " + response);

                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

客户端部分

public class ClientActivity extends AppCompatActivity {

    private static final String TAG = "ClientActivity";

    private EditText mEtMessage;
    private TextView mTvResponse;

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

        mEtMessage = findViewById(R.id.et_message);
        mTvResponse = findViewById(R.id.tv_response);

        new Thread(() -> {
            try {
                Socket socket = new Socket("localhost", 8888);
                Log.d(TAG, "connected.");

                OutputStream outputStream = socket.getOutputStream();
                String message = mEtMessage.getText().toString();
                byte[] bytes = message.getBytes();
                outputStream.write(bytes);

                InputStream inputStream = socket.getInputStream();
                byte[] buffer = new byte[1024];
                int len;
                StringBuilder sb = new StringBuilder();
                while ((len = inputStream.read(buffer)) != -1) {
                    String s = new String(buffer, 0, len);
                    sb.append(s);
                }

                String response = sb.toString();
                Log.d(TAG, "response: " + response);
                runOnUiThread(() -> mTvResponse.setText(response));

                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

以上就是安卓手机socket通信的完整攻略及示例。注意,在实际应用中,客户端和服务器的代码应该分别放在不同的应用中,以实现不同应用之间的socket通信。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:安卓手机socket通信(服务器和客户端) - Python技术站

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

相关文章

  • 为什么要使用自增ID作为主键

    为什么要使用自增ID作为主键 在数据库设计中,主键是非常重要的概念。主键的作用是标识一个数据行,确保每行的唯一性,并且在表中查找数据时提高效率。在大多数情况下,我们会选择自增ID作为主键。 什么是自增ID 自增ID是指在新插入数据时,数据库自动为记录生成一个唯一的ID值。这个ID值通常是一个长整型值,其值在新插入的每行记录中逐个增加。 自增ID的好处 唯一性…

    其他 2023年3月28日
    00
  • MySql服务未知原因消失解决方法

    确定MySql服务是否消失 首先,需要确定MySql服务是否真的消失了。你需要在命令提示符下使用以下命令查看服务状态: net start mysql 如果服务被正常安装,输出结果将为服务的状态,如“正在启动”或“正在运行”。但是,如果服务未安装或已卸载,则会收到错误消息,表明服务不存在。 在此情况下,你需要在本地计算机上重新安装Mysql服务。如果你已经尝…

    other 2023年6月27日
    00
  • 详解Vue项目中出现Loading chunk {n} failed问题的解决方法

    详解Vue项目中出现Loading chunk {n} failed问题的解决方法 在Vue项目开发过程中,有时候会出现“Loading chunk {n} failed”这样的错误提示,导致页面无法正常访问。这种情况通常是由于项目中的JavaScript代码被分割成多个块(chunks)时,某个块无法正确加载导致的。本文将详细讲解此问题的解决方法。 原因分…

    other 2023年6月27日
    00
  • 讲解Python中运算符使用时的优先级

    讲解Python中运算符使用时的优先级 1. 优先级概述 在Python中,不同的运算符具有不同的优先级,当表达式中包含多个运算符时,会根据运算符的优先级确定计算顺序。了解运算符的优先级对编写正确的表达式非常重要。 2. 基本运算符的优先级 以下是Python中常见的基本运算符按优先级从高到低的顺序: 括号:最高优先级,在表达式中用于明确指定计算顺序; 幂运…

    other 2023年6月28日
    00
  • layer插件学习——icon样式

    当然,我可以为您提供有关“layer插件学习——icon样式”的完整攻略,以下是详细说明: layer插件学习——icon样式 layer是一款基于jQuery的Web弹层组,可以用于实现各种弹层效果,包括提示框询问框、加载、页面层等。在layer中,可以使用icon样式为弹层添加图标,提高用户体验。以下是使用layer插件添加icon样式的方法: 方法一:…

    other 2023年5月7日
    00
  • 浅谈SpringBoot Bean加载优先级的问题

    浅谈Spring Boot Bean加载优先级的问题 问题背景 在Spring Boot应用中,Bean的加载顺序可能会对应用程序的正确性产生影响。了解Spring Boot Bean加载优先级的原理将有助于我们更好地管理应用程序的依赖关系和初始化顺序。 Bean加载优先级 Spring Boot使用@Bean注解来标记一个Bean,Bean的加载优先级通常…

    other 2023年6月28日
    00
  • cmd/batifelse嵌套方法

    cmd/bat中if-else嵌套方法 在cmd/bat中,if-else语句是控制流程的重要组成部分。if-else语句可以根条件执行不同的代码块。本攻略将介绍如在cmd/bat中使用if-else语句,并提供两个示例。 ifelse语句的基本语法 在cmd/bat中,ifelse语句的基本语法如下: if 条件 ( 执行代码块1 ) else ( 执行代…

    other 2023年5月9日
    00
  • C#面试题总结——程序设计基础

    C#面试题总结——程序设计基础 C#语言无疑是现在应用最广泛的一种编程语言之一,面对越来越激烈的竞争,对于C#程序员而言,打好程序设计基础,掌握C#编程是关键。以下是本文整理的C#面试题,旨在帮助C#程序员提高自己的技能水平。 一、数据类型 1.1 值类型和引用类型 在C#中,值类型和引用类型是两种不同的类型,它们存储在内存中的位置也不同。 值类型存储在栈中…

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