Python一个简单的通信程序(客户端 服务器)

Python一个简单的通信程序(客户端 服务器)攻略

概述

本文主要介绍如何使用Python语言编写一个简单的通信程序,包括客户端和服务器端。通过使用Python内置的socket库,可以很方便地实现网络通信功能。

步骤

客户端

  1. 导入socket库,并创建一个socket对象。

```python
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
```

上述代码中socket.AF_INET指定了地址族为IPv4,socket.SOCK_STREAM指定套接字类型为流式套接字(TCP协议)。

  1. 连接服务器。首先需要指定服务器的IP地址和端口号,然后使用socket.connect()方法连接服务器。

python
server_address = ('127.0.0.1', 8888)
client_socket.connect(server_address)

这里将服务器地址设为本机地址127.0.0.1,端口号为8888,可以根据实际情况进行调整。

  1. 发送数据。使用socket.send()方法向服务器发送数据。

python
message = 'Hello, server!'
client_socket.send(message.encode())

在本例中,将字符串“Hello, server!”按照UTF-8编码格式转换为字节流发送给服务器。

  1. 接收数据。使用socket.recv()方法从服务器接收数据。

python
data = client_socket.recv(1024)
print('Received from server:', data.decode())

在本例中,接收缓冲区大小为1024字节,接收到的数据使用UTF-8格式解码后输出。

  1. 关闭连接。通信结束后,一定要关闭套接字。

python
client_socket.close()

服务器

  1. 导入socket库,并创建一个socket对象。

```python
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
```

同样,这里指定了地址族为IPv4,套接字类型为流式套接字(TCP协议)。

  1. 绑定地址和端口号。使用socket.bind()方法将服务器的地址和端口号绑定到套接字上。

python
server_address = ('127.0.0.1', 8888)
server_socket.bind(server_address)

  1. 监听客户端连接。使用socket.listen()方法开始监听客户端的连接请求。

python
server_socket.listen(5)

在本例中,设置最大连接客户端数量为5。

  1. 接受客户端连接。使用socket.accept()方法接受客户端的连接请求。

python
client_socket, client_address = server_socket.accept()
print('Client connected:', client_address)

当有客户端连接到服务器时,将返回一个新的套接字和客户端地址。

  1. 接收数据。使用socket.recv()方法从客户端接收数据。

python
data = client_socket.recv(1024)
print('Received from client:', data.decode())

在本例中,接收缓冲区大小为1024字节,接收到的数据使用UTF-8格式解码后输出。

  1. 发送数据。使用socket.send()方法向客户端发送数据。

python
message = 'Hello, client!'
client_socket.send(message.encode())

在本例中,将字符串“Hello, client!”按照UTF-8编码格式转换为字节流发送给客户端。

  1. 关闭连接。通信结束后,一定要关闭套接字。

python
client_socket.close()
server_socket.close()

示例

示例1:客户端发送数据,服务器接收并返回

客户端代码:

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 8888)
client_socket.connect(server_address)

message = 'Hello, server!'
client_socket.send(message.encode())

data = client_socket.recv(1024)
print('Received from server:', data.decode())

client_socket.close()

服务器端代码:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 8888)
server_socket.bind(server_address)

server_socket.listen(5)

client_socket, client_address = server_socket.accept()
print('Client connected:', client_address)

data = client_socket.recv(1024)
print('Received from client:', data.decode())

message = 'Hello, client!'
client_socket.send(message.encode())

client_socket.close()
server_socket.close()

运行以上代码,在客户端控制台输出:

Received from server: Hello, client!

在服务器控制台输出:

Client connected: ('127.0.0.1', 57410)
Received from client: Hello, server!

示例2:客户端发送多条数据,服务器分别接收并返回

客户端代码:

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 8888)
client_socket.connect(server_address)

messages = ['foo', 'bar', 'baz', 'qux']

for message in messages:
    client_socket.send(message.encode())
    data = client_socket.recv(1024)
    print('Received from server:', data.decode())

client_socket.close()

服务器端代码:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 8888)
server_socket.bind(server_address)

server_socket.listen(5)

client_socket, client_address = server_socket.accept()
print('Client connected:', client_address)

while True:
    data = client_socket.recv(1024)
    if not data:
        break
    print('Received from client:', data.decode())
    message = 'ACK ' + data.decode()
    client_socket.send(message.encode())

client_socket.close()
server_socket.close()

运行以上代码,在客户端控制台输出:

Received from server: ACK foo
Received from server: ACK bar
Received from server: ACK baz
Received from server: ACK qux

在服务器控制台输出:

Client connected: ('127.0.0.1', 57412)
Received from client: foo
Received from client: bar
Received from client: baz
Received from client: qux

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python一个简单的通信程序(客户端 服务器) - Python技术站

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

相关文章

  • Win10开始菜单按钮右键点击没反应现象的解决办法

    Win10开始菜单按钮右键点击没反应现象,可能是由于系统文件损坏、驱动问题、第三方软件冲突等原因引起的。下面是针对这一问题的完整攻略: 检查并修复系统文件 在开始菜单中,搜索并选择“命令提示符(管理员)”。 在弹出的窗口中输入命令“sfc /scannow”(不含引号)并按下Enter键。 等待系统扫描和恢复损坏的文件。 示例说明: 假设用户在Win10系统…

    other 2023年6月27日
    00
  • Python基础学习之深浅拷贝问题及递归函数练习

    下面就来详细讲解一下“Python基础学习之深浅拷贝问题及递归函数练习”的完整攻略。 Python 基础学习之深浅拷贝问题及递归函数练习 1. 什么是深浅拷贝 深浅拷贝是 Python 中非常重要的一个概念,它们在使用过程中会经常被涉及到。在 Python 中,我们可以使用 copy 模块中的 copy 函数和 deepcopy 函数来分别实现浅拷贝和深拷贝…

    other 2023年6月27日
    00
  • java中多态概念、实现原理详解

    Java中多态概念、实现原理详解 多态概念 多态是面向对象编程中的一个重要概念,指的是同一类型的对象,在不同情况下具有不同的表现形式和行为。在Java中,多态通常表现为子类对象可以被赋给父类变量,并通过这些变量访问子类中未在父类中定义的属性和方法。在继承、封装、抽象的基础上,多态使得代码更加灵活、可扩展和可维护。 多态实现原理 Java实现多态的方式是通过方…

    other 2023年6月27日
    00
  • linux 程序安装目录/opt目录和/usr/local目录的区别

    Linux程序安装目录中,/opt目录和/usr/local目录是常见的两个目录,它们都是用于安装软件的,但是它们又有一定的区别,下面是该问题的完整攻略: /opt目录的主要作用 /opt目录是系统管理员安装那些由“以厂商为名称”的程序包所安装的程序文件的主目录。这种类型的程序包通常没有在项目的文件系统层次结构标准中被提及。例如,Adobe公司可能会选择在/…

    other 2023年6月27日
    00
  • Python ORM数据库框架Sqlalchemy的使用教程详解

    Python ORM数据库框架Sqlalchemy的使用教程详解 Sqlalchemy是一个强大的Python ORM(对象关系映射)库,它提供了灵活且易于使用的方式来操作数据库。以下是Sqlalchemy的使用教程: 安装Sqlalchemy库: python pip install sqlalchemy 导入Sqlalchemy库: python imp…

    other 2023年10月18日
    00
  • matlab中copyfile的使用

    Matlab中copyfile的使用 在Matlab中,copyfile函数可以用来复制文件或目录。本篇文章将介绍如何使用Matlab中的copyfile函数来复制文件以及常见的错误和处理方式。 复制文件 通过copyfile函数可以复制单个文件: copyfile(‘source_file.txt’, ‘destination_file.txt’) 上述代…

    其他 2023年3月28日
    00
  • Win10专业版错误提示“你的电脑遇到问题,需要重新启动”怎么办

    Win10专业版错误提示“你的电脑遇到问题,需要重新启动”怎么办? 概述 在使用 Windows 10 专业版计算机时,有时可能会遇到错误提示“你的电脑遇到问题,需要重新启动”。这种错误通常被称为 BSOD 或蓝屏(Blue Screen of Death),并且可能由多种原因引起。 本文将提供一些可能有助于解决此问题的步骤和建议。 步骤 步骤1:等待重启完…

    other 2023年6月27日
    00
  • 高手总结的电脑应用技巧

    标题:高手总结的电脑应用技巧 作为一名电脑爱好者,我们需要学习电脑应用技巧,以更好的使用电脑。本文总结了一些高手常用的电脑应用技巧,并结合实例进行讲解。 1. 终端命令 在终端中使用命令,可以让我们更快的完成一些任务。以下是常用终端命令: mkdir directory_name # 创建一个新目录 cd directory_name # 进入目录 ls #…

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