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日

相关文章

  • matlab读struct成数组

    Matlab读取struct成数组完整攻略 在Matlab中,我们可以使用struct来存储和处理结构化数据。有时候,我们需要将struct转换成数组,以便进行进一步的算和分析。本攻略将详介绍如何将struct转换成数组,包括基本概念、转换方法和示例说明。 基本概念 在Matlab中struct一种用于存储和处理结构化数据的数据类型。struct由一组字段组…

    other 2023年5月6日
    00
  • vant开发指南

    以下是关于“vant开发指南”的完整攻略: Vant简介 Vant是一个基于Vue.js的移动端UI组件库,提供了丰富组件和样式,可以快速构建高质量的移动应用。Vant的组件库包括常用的UI组件如按钮、表单、列表、弹窗等,同时还提供一些高级组件如日历、时间轴等。 安装Vant 在Vue.js项目中,可以使用以下命令安装Vant: npm install va…

    other 2023年5月9日
    00
  • c#-如何仅对ipv4进行ping操作?

    在C#中,可以使用System.Net.NetworkInformation命名空间中的Ping类来执行ping操作。如果您只想对IPv4地址执行ping操作,则可以使用以下方法: 步骤1:创建Ping对象 首先,您需要创建一个Ping对象。可以使用以下代码创建一个Ping对象: Ping ping = new Ping(); 步骤2:设置Ping选项 接下…

    other 2023年5月9日
    00
  • Create vite理解Vite项目创建流程及代码实现

    Create Vite理解Vite项目创建流程及代码实现 Vite是一个快速的Web开发构建工具,本攻略将详细讲解如何使用Vite创建项目,并提供两个示例说明。 步骤1:安装Vite 首先,确保你已经安装了Node.js。然后,打开终端并运行以下命令来全局安装Vite: npm install -g create-vite 步骤2:创建Vite项目 在终端中…

    other 2023年10月13日
    00
  • 新建虚拟机_win864位系统_启动报错directory’ezboot’no…

    新建虚拟机_win864位系统_启动报错directory’ezboot’no… 当我们在新建虚拟机时,有时候可能会出现虚拟机无法启动的问题,其中一个常见的问题就是 “directory ‘ezboot’ not found” 报错。该错误通常出现在启动虚拟机时,提示未能找到指定的文件或目录。下面,我们将介绍如何解决该问题。 原因 该错误通常是由于虚拟机…

    其他 2023年3月28日
    00
  • C++中内存池的简单原理及实现详解

    C++中内存池的简单原理及实现详解 什么是内存池? 内存池是一种用于管理内存分配和释放的技术。它通过预先分配一块连续的内存空间,并将其划分为多个固定大小的块,以提高内存分配和释放的效率。内存池可以减少内存碎片化和频繁的系统调用,从而提高程序的性能。 内存池的实现原理 内存池的实现原理可以分为以下几个步骤: 初始化内存池:首先,我们需要分配一块连续的内存空间作…

    other 2023年8月1日
    00
  • VC++开发中完美解决头文件相互包含问题的方法解析

    当我们在VC++的开发中,如果头文件之间相互包含,可能会导致编译错误。这个问题的根本原因在于,当 A 头文件中包含了 B 头文件,并且 B 头文件又包含了 A 头文件,那么编译器无法解决该如何编译这些文件。为了完美解决这个问题,我们需要遵循以下几个步骤: 第一步:避免使用预编译头文件 在VC++的开发中,预编译头文件是一个常用的文件。该文件中包含了经常使用到…

    other 2023年6月27日
    00
  • Win10怎么解决提示由于启动计算机时出现页面文件配置问题?

    以下是解决提示由于启动计算机时出现页面文件配置问题的完整攻略: 问题描述 当启动 Win10 计算机时,经常会遇到提示页面文件配置错误的问题。具体来说,启动时可能会出现以下类似的提示: “Windows 没有正确启动。可能原因:与安装的硬件或软件有关,或者硬磁盘已损坏。文件 \WINDOWS\SYSTEM32\CONFIG\SYSTEM 需要修复。” 通常情…

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