Linux文件传输(Linux项目)__2018.05.22

本文介绍了一个基于FTP协议的文件传输项目案例,详细探讨了如何设计与实现客户端及服务器端之间的文件上传、下载等功能,并讲解了多线程、断点续传等关键技术的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码的组织能力。

有一个项目去讲,体现自己的代码能力。

文件传输,网络。

协议的设计。

解决、寻找问题的能力。练习。

文件传输最基本的功能。ftp协议。可以做到和发图片类似的功能。

改ip:127.0.0.1

代码的设计。

在ftp中设计像个重要的概念:上传、下载。

链接上服务器。通过客户端可以对服务器端文件进行一些操作。

把服务器部署在一台计算机上。

断点续传,秒传。

项目比较大了:需求分析---->自己思考---->业务逻辑---->代码上的设计。

将思路翻译成代码的能力。

项目积累多了。。。实际上都是文件管理项目。

客户端对服务器端进行操作,通过系统调用或命令处理。

先让客户端和服务器端链接上。通过多线程实现。

通过套接字传送,通过网络传送数据。

服务器端的结构。文件管理部分的代码。

通过多线程,让服务器和客户端的并发来链接。

服务器处理链接,子线程处理。10个客户端就有10个子进程进行处理。



# SPDX-FileCopyrightText: 2018 Dan Halbert for Adafruit Industries # # SPDX-License-Identifier: MIT """ `Gamepad` ==================================================== * Author(s): Dan Halbert """ import struct import time from adafruit_hid import find_device class Gamepad: """Emulate a generic gamepad controller with 16 buttons, numbered 1-16, and two joysticks, one controlling ``x` and ``y`` values, and the other controlling ``z`` and ``r_z`` (z rotation or ``Rz``) values. The joystick values could be interpreted differently by the receiving program: those are just the names used here. The joystick values are in the range -127 to 127.""" def __init__(self, devices): """Create a Gamepad object that will send USB gamepad HID reports. Devices can be a list of devices that includes a gamepad device or a gamepad device itself. A device is any object that implements ``send_report()``, ``usage_page`` and ``usage``. """ self._gamepad_device = find_device(devices, usage_page=0x1, usage=0x05) # Reuse this bytearray to send mouse reports. # Typically controllers start numbering buttons at 1 rather than 0. # report[0] buttons 1-8 (LSB is button 1) # report[1] buttons 9-16 # report[2] joystick 0 x: -127 to 127 # report[3] joystick 0 y: -127 to 127 # report[4] joystick 1 x: -127 to 127 # report[5] joystick 1 y: -127 to 127 self._report = bytearray(6) # Remember the last report as well, so we can avoid sending # duplicate reports. self._last_report = bytearray(6) # Store settings separately before putting into report. Saves code # especially for buttons. self._buttons_state = 0 self._joy_x = 0 self._joy_y = 0 self._joy_z = 0 self._joy_r_z = 0 # Send an initial report to test if HID device is ready. # If not, wait a bit and try once more. try: self.reset_all() except OSError: time.sleep(1) self.reset_all() def press_buttons(self, *buttons): """Press and hold the given buttons.""" for button in buttons: self._buttons_state |= 1 << self._validate_button_number(button) - 1 self._send() def release_buttons(self, *buttons): """Release the given buttons.""" for button in buttons: self._buttons_state &= ~(1 << self._validate_button_number(button) - 1) self._send() def release_all_buttons(self): """Release all the buttons.""" self._buttons_state = 0 self._send() def click_buttons(self, *buttons): """Press and release the given buttons.""" self.press_buttons(*buttons) self.release_buttons(*buttons) def move_joysticks(self, x=None, y=None, z=None, r_z=None): """Set and send the given joystick values. The joysticks will remain set with the given values until changed One joystick provides ``x`` and ``y`` values, and the other provides ``z`` and ``r_z`` (z rotation). Any values left as ``None`` will not be changed. All values must be in the range -127 to 127 inclusive. Examples:: # Change x and y values only. gp.move_joysticks(x=100, y=-50) # Reset all joystick values to center position. gp.move_joysticks(0, 0, 0, 0) """ if x is not None: self._joy_x = self._validate_joystick_value(x) if y is not None: self._joy_y = self._validate_joystick_value(y) if z is not None: self._joy_z = self._validate_joystick_value(z) if r_z is not None: self._joy_r_z = self._validate_joystick_value(r_z) self._send() def reset_all(self): """Release all buttons and set joysticks to zero.""" self._buttons_state = 0 self._joy_x = 0 self._joy_y = 0 self._joy_z = 0 self._joy_r_z = 0 self._send(always=True) def _send(self, always=False): """Send a report with all the existing settings. If ``always`` is ``False`` (the default), send only if there have been changes. """ struct.pack_into( "<Hbbbb", self._report, 0, self._buttons_state, self._joy_x, self._joy_y, self._joy_z, self._joy_r_z, ) if always or self._last_report != self._report: self._gamepad_device.send_report(self._report) # Remember what we sent, without allocating new storage. self._last_report[:] = self._report @staticmethod def _validate_button_number(button): if not 1 <= button <= 16: raise ValueError("Button number must in range 1 to 16") return button @staticmethod def _validate_joystick_value(value): if not -127 <= value <= 127: raise ValueError("Joystick value must be in range -127 to 127") return value 使用这个库
最新发布
08-16
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值