Code Crafting

There are two equivalence classes of idiots: Those who yearn for the past that never was. AND Those who dream of the future that never will be.

相比于 TCP 的面向连接、可靠传输,UDP 协议是一种无连接、不保证数据可靠性和顺序的传输方式。它更适用于对实时性要求高,但对丢包不敏感的场景,比如视频直播、在线游戏和语音通信等。Python 中的 socket 模块同样封装了 UDP 协议,为程序员提供了简便的接口来实现 UDP 通信。本文将分别介绍 UDP 通信中的客户端与服务端实现方法,并给出相应的代码示例。

客户端

UDP 客户端无需建立连接,而是直接将数据报发送到指定的服务器地址和端口。下面的示例展示了如何使用 Python 的 socket 模块实现一个简单的 UDP 客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import socket

# 创建一个 UDP socket,AF_INET表示IPv4,SOCK_DGRAM表示使用UDP协议
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 定义服务端的地址与端口
server_addr = ("127.0.0.1", 8888)

# 要发送的消息
message = "hello, UDP"

# 使用sendto方法将消息发送到指定的服务端地址
s.sendto(message.encode(), server_addr)

# 接收来自服务端的响应,recvfrom返回一个元组:(数据, 服务端地址)
data, addr = s.recvfrom(1024)
if data:
recv_message = data.decode()
print(f"接收到来自 {addr} 的消息: {recv_message}")

s.close()
阅读全文 »

学习过计算机网络,我们就知道传输层依靠TCP与UDP协议进行消息传输,socket是封装了TCP与UDP协议的一个面向程序员的接口。我们在网络编程时,会经常用到socket,下面就讲讲如何用python的socket实现服务端与客户端之间的TCP通信

概述

TCP通信,需要有一个服务端,一个或多个客户端。服务端监听端口,等待连接。客户端访问端口,请求连接。

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 导入socket库
import socket

# 创建一个socket, AF_INET表示使用IPV4,SOCK_STREAM表示使用TCP协议
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 与服务端连接,addr是服务端的地址与端口
addr = ("127.0.0.1", 8888)
s.connect(addr)

# 建立连接后就可以发送消息了
message = "hello"
s.sendall(message.encode())

# 接受消息并打印出来
# recv(max) 表示一次接收多少字节的数据,这里是1024字节,也可以是2048等等。
recv_datagram = s.recv(1024)
if recv_datagram:
recv_message = recv_datagram.decode()
print(f"receive message {recv_message} from server")

s.close()
阅读全文 »

今天看到了一个UCI教授的个人主页,发现很有趣,想跟大家分享一下。

这位教授在页面放了三个简单的测试,来让学生判断是否适合找他做博士导师。我觉得这三个测试很有意思,于是翻译了一下,可以看一看。

  • round 1

    image-20230417163900489

阅读全文 »

在许多文档处理工作中,自动生成目录是一个常见的需求,尤其是对于大型PDF文档。手动创建目录可能会很繁琐且耗时,因此寻找自动化的解决方案是很有必要的。在这篇博客中,推荐一个强大的命令行工具 - pdf.tocgen,它可以帮助我们自动生成PDF文档的目录。

网上还有很多其他工具可以自动生成目录,但是基本都需要提前找到完整的目录信息,才可以为pdf生成目录。这个工具不需要完整的目录信息,只需根据一点信息,就可以从pdf自动推导出目录。因为很多时候我们无法找到pdf文件的已有目录信息,所以我推荐这个工具。

0 简介

效果

我用一本zlib上下载的pdf英文书为例,下载下来时是没有目录的,用preview打开效果如下, 可以看到左边是没有目录的。

image-20230417210146885

使用该工具后可以达到的效果如下,可以看到已经成功生成了目录,并且可以正确跳转。

image-20230508110929077

阅读全文 »

容器

容器是另外一种轻量级的虚拟化,容器是共用主 机内核,利用内核的虚拟化技术隔离出一个独立的运行环境,拥有独立的一个文件系统,网络空间,进程空间视图等

容器与虚拟机的区别

容器跟虚拟机很相似,但是依然有不同,容器与虚拟机本质的区别是:

容器是进程级别的资源隔离。虚拟机是操作系统级别的资源隔离

Docker

Docker是一个开源的容器化平台,在Linux,Windows,Mac上都可以使用。

Docker可以分为三部分:

  • Docker client

    Docker客户端是命令行工具,它与Docker守护进程(deamon)通信,用于创建、管理和操作Docker容器、镜像、网络等资源。Docker客户端可以在本地或远程计算机上运行,以便与Docker守护进程通信。

  • Docker deamon

    Docker守护进程是运行在主机上的后台进程,负责管理Docker容器、镜像、网络等资源。它通过与Docker客户端通信来响应请求,包括创建、启动、停止、删除容器等操作。

  • Docker registry

    Docker镜像库是Docker镜像(Docker image)的存储库,可以存储和分享Docker镜像

image-20230323142740024

阅读全文 »

因为之前有一个Azure的最基础的云服务器,就想着搭一个VPS,一直拖了很久才行动,下面是搭建过程的一些记录。如果作为一个教程看,可以直接跳过不需要的部分,比如升级系统。不过一定要看最后,最后有写我为什么成功后又失败了。

本文所使用的设施

云服务器

  • 服务:Azure Standard B1s

    1G内存 64G磁盘

  • 操作系统:Linux CentOS 7.6

    1
    2
    3
    4
    5
    6
    [CentOS]$ cat /etc/redhat-release
    CentOS Linux release 7.9.2009 (Core)
    [CentOS]$ uname -r
    3.10.0-1160.71.1.el7.x86_64
    [CentOS]$ sysctl net.ipv4.tcp_available_congestion_control
    net.ipv4.tcp_available_congestion_control = cubic reno
  • 位置:East Asia

  • 服务器获取来源:Azure student

阅读全文 »

这篇文章主要概括性地讲一下设计模式和它的一些原则。目的是让读者能对设计模式有一个整体上的了解与感受,为深入学习设计模式打下基础。

从“模式”讲起

​ “模式”一词最早诞生于建筑领域,在Christopher Alexander教授的一书中,他写道“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。后来“模式”这个概念被用于软件开发中,尤其是面向对象编程中。在面向对象设计模式中,核心的思想依然是这样。

​ 设计模式(design pattern)是软件开发中广泛使用的解决方案,用于解决在日常工作中遇到的常见问题。它们是对重复的设计问题的可重复使用的解决方案,它们提供了一种封装和组织代码的方法,使代码更易于维护,理解和扩展。

设计模式

阅读全文 »
0%