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日

相关文章

  • spring BeanProcessor接口详解

    Spring BeanProcessor接口详解 概述 Spring BeanProcessor接口是Spring容器提供的一个扩展点,它可以在Bean实例化、属性注入、初始化等环节进行干预操作,提供了非常灵活的扩展方式。 Spring中BeanProcessor接口的实现方式有很多,常见的有BeanPostProcessor、InstantiationAw…

    other 2023年6月27日
    00
  • 电脑重启一直显示正在准备windows怎么办?

    当电脑重启后,出现“正在准备 Windows”字样的情况,通常是系统遇到了一些问题而无法正常启动。以下是电脑重启一直显示正在准备 Windows 的完整攻略: 情况一:出现“正在准备 Windows”的情况 等待一段时间。在一些情况下,系统需要一些时间才能准备好进入 Windows,这是正常的现象。如果等待一段时间后仍然无法进入系统,则需要采取其他方法。 尝…

    other 2023年6月26日
    00
  • webpack的懒加载和预加载详解

    Webpack的懒加载和预加载详解 Webpack是一个有着强大功能的模块打包工具,其又提供了一些有用的特性,如懒加载和预加载,允许你以更高效的方式加载你的应用程序。 懒加载 懒加载也称为延迟加载,其允许你在需要时才去加载某些组件或模块,而不是在应用程序启动时全局加载。这样做可以显著提高应用程序的性能,因为不需要加载所有内容。 懒加载通过分割你的代码包来实现…

    other 2023年6月25日
    00
  • 苹果 iOS 15.5/ iPadOS 15.5 开发者预览版 Beta 发布 (附更新内容大全)

    苹果 iOS 15.5/ iPadOS 15.5 开发者预览版 Beta 发布 (附更新内容大全)攻略 近日,苹果公司发布了 iOS 15.5/ iPadOS 15.5 开发者预览版 Beta,本篇攻略将会详细讲解这个更新内容的大全。 更新内容 以下是 iOS 15.5/ iPadOS 15.5 开发者预览版 Beta 的更新内容: 1. 网络中断问题修复 …

    other 2023年6月26日
    00
  • idea 创建properties配置文件的步骤

    下面是详细的“idea 创建properties配置文件的步骤”的攻略: 1. 新建properties配置文件 在项目的源代码目录(比如src/main/resources)下,右键点击鼠标,选择New -> File,然后在弹出的对话框中输入文件名,并且在后缀名处输入“.properties”(注意前面的点号),最后点击Ok即可创建一个空的prop…

    other 2023年6月25日
    00
  • rqalpha环境搭建(windows版)

    RQAlpha环境搭建(Windows版) RQAlpha是一款Python下基于Python3的开源量化交易研究框架。相较于其他的Python量化框架,RQAlpha具有开源、便捷、高效和易用等优点。在Windows系统下,RQAlpha的环境搭建需要涉及到Python环境配置、RQAlpha安装以及TA-Lib安装等步骤。下文将逐一介绍Windows系统…

    其他 2023年3月28日
    00
  • win7下的两台电脑复制文件时提示文件夹名称过长

    当我们在Win7下的两台电脑复制文件时,可能会遇到“文件夹名称过长”的提示。这是因为Windows系统在处理文件名称时,有一定的限制,单个文件或文件夹的名称不能超过255个字符。 解决这个问题的方法是使用一些工具或方法来缩短文件夹名称。以下是一些可行的方法: 1. 使用WinRAR压缩文件夹 步骤: 右键点击需要复制的文件夹,选择“添加到压缩文件”。 在弹出…

    other 2023年6月26日
    00
  • 战地4游戏秘籍 WIN8系统64位停止工作画面闪烁解决方法

    战地4游戏秘籍 WIN8系统64位停止工作画面闪烁解决方法 如果你在玩战地4游戏时,遇到了WIN8系统64位停止工作画面闪烁等问题,不要惊慌。本文将为您提供一些解决问题的方案。 方案一:更新显卡驱动 由于战地4是一款画面较为精美的游戏,因此如果您的显卡驱动过旧,可能会导致游戏停止工作或画面闪烁等问题。因此,我们建议您更新显卡驱动,具体步骤如下: 确认自己的显…

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