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客户端之间的实时消息通信,这对于一些即时通讯、聊天系统等程序来说非常有用。

阅读剩余 70%

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

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

相关文章

  • Perl内置特殊变量总结

    Perl内置特殊变量总结攻略 Perl是一种功能强大的编程语言,它提供了许多内置的特殊变量,这些变量在编写Perl脚本时非常有用。本攻略将详细介绍Perl内置特殊变量的用法和示例。 1. $_变量 $_是Perl中最常用的特殊变量之一。它是默认的输入和模式匹配变量。当没有指定变量时,Perl通常会使用$_。下面是一个示例: while (<STDIN&…

    other 2023年7月29日
    00
  • Android利用Fragment实现Tab选项卡效果

    Android利用Fragment实现Tab选项卡效果攻略 在Android开发中,我们可以使用Fragment来实现Tab选项卡效果,这样可以方便地切换不同的内容页面。下面是一个详细的攻略,包含了两个示例说明。 步骤一:创建布局文件 首先,我们需要创建一个布局文件来显示Tab选项卡和对应的内容页面。可以使用TabLayout和ViewPager来实现这个效…

    other 2023年9月7日
    00
  • 微信小程序动态的加载数据实例代码

    items: [], // 初始数据为空数组 page: 1, // 当前页码 pageSize: 3, // 每页加载的数据条数 }, onLoad() { // 渲染初始数据 this.renderData(); }, renderData() { // 获取要加载的数据 const startIndex = (this.data.page – 1) *…

    other 2023年7月29日
    00
  • Win10一周年更新正式版补丁14393.187推送:更新修复内容汇总

    Win10一周年更新正式版补丁14393.187推送:更新修复内容汇总攻略 介绍 Win10一周年更新正式版补丁14393.187是Windows 10操作系统的一个重要更新补丁,它包含了一系列的修复和改进,以提高系统的稳定性和安全性。本攻略将详细介绍该补丁的安装和更新过程,并列举一些修复内容的示例。 步骤 步骤1:检查更新 首先,确保你的计算机已连接到互联…

    other 2023年8月3日
    00
  • C语言修炼之路数据类型悟正法 解析存储定风魔下篇

    C语言修炼之路数据类型悟正法 解析存储定风魔下篇攻略 一、 概述 本篇攻略将详细讲解C语言修炼之路数据类型悟正法的存储方法以及相关概念。包含如下内容: 数据类型的存储方式 存储定风魔机制 静态存储、动态存储 堆与栈的存储 二、 数据类型的存储方式 C语言中的数据类型分为两大类:基本数据类型和派生数据类型。其中,基本的数据类型包括int,char,float和…

    other 2023年6月27日
    00
  • C语言实现串的顺序存储表示与基本操作

    C语言中,可以使用数组实现串的顺序存储表示。下面是实现串的顺序存储表示和基本操作的攻略: 串的顺序存储表示 串的顺序存储表示可以借助于字符数组来实现,数组元素存储的是串中字符的ASCII码。数组中每一个元素表示一个字符。为了标识串的结束,我们可以在串的末尾增加一个特殊的字符’\0’,称为“串结束符”。 #define MAXSIZE 100 //定义字符数组…

    other 2023年6月26日
    00
  • Kotlin字节码层探究构造函数与成员变量和init代码块执行顺序

    接下来我将为你详细讲解 Kotlin 字节码层探究构造函数、成员变量和 init 代码块执行顺序的攻略。 背景 在 Kotlin 中,成员变量和 init 代码块是可以在类中定义的,而它们的执行顺序和构造函数有着密切的关系。在了解 Kotlin 字节码层探究构造函数、成员变量和 init 代码块执行顺序之前,我们先来回顾一下 Kotlin 中的构造函数。 K…

    other 2023年6月26日
    00
  • SpringCloud学习笔记之OpenFeign进行服务调用

    下面我来给你详细讲解 SpringCloud 学习笔记中的 OpenFeign 进行服务调用的完整攻略。 什么是 OpenFeign OpenFeign 是一个基于 Netflix Feign 客户端的开源声明式服务调用框架,它比 RestTemplate 更加简洁、方便、灵活。它的主要作用是帮助开发者快速便捷地实现微服务之间的调用。 如何使用 OpenFe…

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