python搭建服务器实现两个Android客户端间收发消息

yizhihongxing

题目描述:

本文主要介绍使用Python搭建服务器实现两个Android客户端间收发消息的完整攻略,包含以下内容:

  1. 简介
  2. 搭建TCP服务器
  3. 实现消息收发
  4. 示例代码
  5. 总结

简介

本文主要是介绍如何使用Python Socket模块搭建一个TCP服务器,并实现Android客户端和服务器之间的实时消息通信。

搭建TCP服务器

Python Socket模块是实现网络编程最常用的模块之一。首先我们需要在Python中引入Socket模块。

import socket

创建一个TCP服务器,以下是创建服务器的代码示例:

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 9999)) # 绑定 IP地址端口号
server_socket.listen(5) # 监听服务端口,可以接收的客户端连接数为5

解释一下上述代码:
- 使用 socket.socket() 创建了一个 socket 对象,AF_INET 参数是使用IPv4协议。SOCK_STREAM 参数指定了这个 socket 是基于TCP协议的。
- bind() 方法可以绑定一个 IP 地址和端口号来监听,这里我们监听所有IP地址的9999端口号。
- listen() 方法是监听客户端连接请求。参数是5,指定在拒绝新连接之前,服务器将收到的连接请求排队的最大数量为5.

实现消息收发

我们再来看以下如何实现Android客户端和服务器之间的实时消息通信。以下是服务器端收发消息的代码示例:

 while True:
    # 接收客户端连接请求
    client_socket, client_address = server_socket.accept()
    client_socket.settimeout(180)
    try:
        # 向客户端发送欢迎信息
        client_socket.send("Welcome, Client!Please send your message!".encode('gb2312'))
        while True:
            try:
                # 接收客户端消息
                data = client_socket.recv(1024).decode('gb2312')
                # 将接收到的消息发送给所有其它连接到服务器的客户端
                for c in client_sockets:
                    if c != client_socket:
                        c.send("{} said: {}".format(str(client_address), data).encode('gb2312'))
            except socket.timeout:
                # 客户端连接超时
                print("{} connect timeout".format(client_address))
                break

解释一下上方代码:
- 进入一个无限循环,任何时候都有可能有客户端连接请求发过来,接收请求后继续循环等待。
- 使用 accept() 方法接收客户端的请求。此时会返回一个 client_socket 对象和客户端的地址信息;
- 向客户端发送欢迎信息,接下来进入一个无限循环,等待客户端发送消息;
- 如果有客户端发送消息,我们遍历所有连接到服务器的客户端,然后将这个消息发送给其它连接到服务器的客户端。

以下是Android客户端发送消息的代码示例:

Socket socket = new Socket("192.168.1.100", 9999);
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out.println("Hello Server!");
String response = in.readLine();

解释一下上方代码:
- 首先创建 TCP Socket 对象,指定服务器IP地址和端口号;
- 然后使用 PrintWriter 对象将消息发送给服务器;
- 阻塞式等待服务器的返回结果,即返回读取到的消息。

示例代码

以下是一个完整的示例代码:

import socket
import threading

def handle_client(client_socket, client_sockets, address):
    client_socket.settimeout(180)
    client_sockets.append(client_socket)
    try:
        client_socket.send("Welcome, Client!Please send your message!".encode('gb2312'))
        while True:
            try:
                data = client_socket.recv(1024).decode('gb2312')
                if not data or data == "exit": break
                for c in client_sockets:
                    if c != client_socket:
                        c.send("{} said: {}".format(str(address), data).encode('gb2312'))
            except socket.timeout:
                print("{} connect timeout".format(address))
                break
    except:
        pass
    finally:
        client_sockets.remove(client_socket)
        client_socket.close()

if __name__ == "__main__":
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', 9999))
    server_socket.listen(5)
    client_sockets = []

    while True:
        client_socket, address = server_socket.accept()
        print("{} connected to the server".format(address))
        client_thread = threading.Thread(target=handle_client, args=(client_socket, client_sockets,address))
        client_thread.start()

Java Android 客户端的示例代码

Socket socket = null;
BufferedReader input = null;
PrintWriter output = null;
StringBuilder sb = null;
try {
    socket = new Socket("192.168.1.100", 9999);
    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
    output.println("Hello Server, I am a new Android!");
    //读取服务器返回的消息
    sb = new StringBuilder();
    String line = null;
    while ((line = input.readLine()) != null) {
        sb.append(line);
    }
    Log.i(TAG, "Received from server: " + sb.toString());
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        if (input != null) input.close();
        if (output != null) output.close();
        if (socket != null) socket.close();
    }catch (IOException e) {
        e.printStackTrace();
    }
}

总结

通过编写Python服务器程序,我们可以实现多个Android客户端之间的实时消息通信,这对于一些即时通讯、聊天系统等程序来说非常有用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python搭建服务器实现两个Android客户端间收发消息 - Python技术站

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

相关文章

  • 分析攻击IP来源地与防御IP攻击的应对策略

    分析攻击IP来源地与防御IP攻击的应对策略攻略 1. 攻击IP来源地分析 1.1 收集攻击日志 首先,我们需要收集系统或网络设备上的攻击日志。这些日志可以包含来自不同IP地址的攻击尝试的详细信息,例如攻击时间、攻击类型和攻击目标等。 1.2 分析攻击日志 通过对收集到的攻击日志进行分析,我们可以确定攻击IP的来源地。这可以通过以下步骤实现: 提取攻击日志中的…

    other 2023年7月31日
    00
  • JS中如何判断传过来的JSON数据中是否存在某字段

    可以通过JS中Object的hasOwnProperty方法来判断一个传入的JSON数据中是否存在某个字段。hasOwnProperty方法可以检测一个Object对象自身是否包含指定的属性,如果包含,则返回true,否则返回false。 以下是示例代码: const jsonObj = {"name": "Tom",…

    other 2023年6月25日
    00
  • Android 自定义View手写签名并保存图片功能

    Android 自定义View手写签名并保存图片功能 本攻略将详细介绍如何在Android应用中实现自定义View手写签名并保存图片的功能。 步骤一:创建自定义View 首先,我们需要创建一个自定义View来实现手写签名的功能。可以继承View类或者使用现有的绘图库,如Canvas和Paint。 示例代码: public class SignatureVie…

    other 2023年10月13日
    00
  • 分享JavaScript 中的几种继承方式

    分享JavaScript 中的几种继承方式 为什么需要继承? 在编写代码的过程中,我们不可能每一次都从零开始写。很多时候,我们需要利用现有的代码来实现新的功能,这就是继承的一个重要应用场景。 我们之所以需要继承,是因为继承可以让我们复用代码,避免重复劳动和代码冗余。当我们需要对某一种对象进行扩展时,继承就是我们的好选择。 继承的几种方式 在JavaScrip…

    other 2023年6月26日
    00
  • Windows中的批处理的常用符号介绍

    下面是Windows中的批处理的常用符号介绍的完整攻略。 批处理符号介绍 批处理文件是面向计算机的一个命令脚本,可以自动化完成某一系列操作。在编写批处理脚本时,需要掌握一些特殊符号来完成某些操作。 echo echo命令可以输出文本信息到屏幕上,语法如下: echo <字符串> 示例: 假设要输出“Hello World!”到屏幕上,可以使用以下…

    other 2023年6月26日
    00
  • 浅谈js中的变量名和函数名重名

    在JavaScript中,变量名和函数名可以重名,但这可能会导致一些问题。下面是一个详细的攻略,帮助您了解JavaScript中变量名和函数名重名的问题。 … 变量名和函数名重名的问题 当变量名和函数名重名时,可能会导致以下问题: 变量被函数覆盖:如果变量名和函数名重名,那么函数的定义将覆盖变量的值,导致无法访问原始变量的值。 函数调用错误:如果变量名和…

    other 2023年8月8日
    00
  • 图解python全局变量与局部变量相关知识

    图解Python全局变量与局部变量相关知识攻略 在Python中,全局变量和局部变量是两种不同的变量类型,它们的作用范围和生命周期有所不同。下面将详细讲解这两种变量类型的特点和使用方法,并提供两个示例来说明。 全局变量 全局变量是在整个程序中都可以访问的变量,它的作用范围是全局的。在任何函数内部都可以使用全局变量,但需要注意全局变量的作用域。 定义全局变量 …

    other 2023年7月29日
    00
  • java 中模拟TCP传输的客户端和服务端实例详解

    Java 中模拟 TCP 传输的客户端和服务端实例详解 本攻略将介绍如何使用 Java 编写模拟 TCP 传输的客户端和服务端程序。在本攻略中,我们将使用 Java 的 Socket 和 ServerSocket 类来实现 TCP 传输的功能。 前置知识 在开始本攻略之前,需要对以下知识点有一定的了解: Java 基础知识 TCP/IP 协议 Socket …

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