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

题目描述:

本文主要介绍使用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日

相关文章

  • python实现写数字文件名的递增保存文件方法

    当我们需要自动保存一些文件的时候,文件名的编号往往需要自动递增。借助 Python 的一些库函数以及一些语法特性,可以方便地实现这个功能。 以下是一个完整的实现攻略: 步骤一:引入必要的库函数 我们需要使用 os 和 shutil 库函数。其中,os 模块能够获取文件和目录的信息,而 shutil 则包含一些高级的文件操作函数。 import os impo…

    other 2023年6月26日
    00
  • 简介Nginx服务器的Websockets配置方法

    简介Nginx服务器的Websockets配置方法攻略 1. 安装Nginx服务器 首先,确保你已经安装了Nginx服务器。你可以通过以下命令在Ubuntu上安装Nginx: sudo apt update sudo apt install nginx 2. 配置Nginx服务器 接下来,我们需要对Nginx服务器进行配置以支持Websockets。打开Ng…

    other 2023年8月18日
    00
  • 注解处理器(APT)是什么

    注解处理器(APT)是什么 注解处理器(Annotation Processing Tool,简称APT)是Java编译器提供的一个工具,它可以在编译时扫描和处理源代码中的注解,并生成新的Java代码。APT通过在源代码中添加注解来实现编译时的自动化处理。 APT的优势 APT的主要优势在于它可以在编译时根据注解生成新的代码,这种特性可以帮助开发人员减少重复…

    other 2023年6月28日
    00
  • 关于AutoCAD 2010在VS 2010上无法调试问题的解决方法

    下面就详细讲解一下“关于AutoCAD 2010在VS 2010上无法调试问题的解决方法”的完整攻略。 问题描述 当我们使用VS 2010进行开发,配合AutoCAD 2010进行调试时,可能会遇到无法调试的问题。此时,在VS的调试工具栏上,启用“调试 – 附加到进程”命令后,无法找到AutoCAD进程。 问题原因 AutoCAD 2010是一个大型的CAD…

    other 2023年6月26日
    00
  • 白夜追凶一家五口谁杀的

    白夜追凶一家五口谁杀的 最近在网上火爆一部国产剧《白夜追凶》,故事情节紧凑,悬疑丛生,随着剧情发展,一个家庭惨案的真相浮出水面,“五口之家”的死因,嫌疑人纷至沓来,真正的凶手究竟是谁? 具体情景 “五口之家”住在高档小区中一处高层公寓,一天晚上,他们中的四口发生了离奇死亡,死因各异,而最后仅有的一个幸存者——临时回家的女儿,成为了所有人仅有的希望,在公安机关…

    其他 2023年3月29日
    00
  • 基于Python编写一个简单的垃圾邮件分类器

    以下是关于基于Python编写一个简单的垃圾邮件分类器的完整攻略,包含两个示例说明: 1. 数据准备和预处理 首先,我们需要准备用于训练和测试的数据集。可以使用已标记为垃圾邮件和非垃圾邮件的样本数据。然后,我们需要对数据进行预处理,包括去除停用词、标记化、词干提取等。 示例说明: import nltk from nltk.corpus import sto…

    other 2023年10月19日
    00
  • 从错误中学习改正Go语言五个坏习惯提高编程技巧

    从错误中学习改正Go语言五个坏习惯提高编程技巧 引言 在学习和使用Go语言时,我们可能会养成一些不良的编程习惯。这些习惯可能会导致代码质量下降、性能问题以及难以维护的代码。本攻略将介绍五个常见的坏习惯,并提供改正这些习惯的方法,以帮助您提高Go语言编程技巧。 1. 不检查错误 在Go语言中,错误处理是非常重要的。忽略错误可能会导致程序崩溃或产生不可预料的行为…

    other 2023年7月29日
    00
  • 如何使用Spring Boot实现自定义Spring Boot插件

    下面就来详细讲解一下如何使用Spring Boot实现自定义Spring Boot插件的完整攻略。 1. 创建Spring Boot项目 首先,我们需要创建一个新的Spring Boot项目。可以使用如下命令: $ mvn archetype:generate -DgroupId=com.example -DartifactId=spring-boot-pl…

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